summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2011-04-07 23:42:04 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2011-04-07 23:42:04 +0000
commit945ce419c806c73d70203dec33ececafbe108a92 (patch)
treecfcdb59bf47e9db7f9e01f7eebb59924bdeaea94 /src/display
parentMerge from trunk (again) (diff)
parentExtensions. SVG+media fix (see Bug #400356). (diff)
downloadinkscape-945ce419c806c73d70203dec33ececafbe108a92.tar.gz
inkscape-945ce419c806c73d70203dec33ececafbe108a92.zip
Merge from trunk
(bzr r9508.1.73)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/Makefile_insert3
-rw-r--r--src/display/cairo-utils.cpp22
-rw-r--r--src/display/cairo-utils.h12
-rw-r--r--src/display/canvas-arena.cpp6
-rw-r--r--src/display/canvas-arena.h1
-rw-r--r--src/display/canvas-axonomgrid.cpp5
-rw-r--r--src/display/canvas-axonomgrid.h2
-rw-r--r--src/display/canvas-bpath.cpp15
-rw-r--r--src/display/canvas-bpath.h11
-rw-r--r--src/display/canvas-grid.cpp7
-rw-r--r--src/display/canvas-grid.h7
-rw-r--r--src/display/canvas-temporary-item-list.h3
-rw-r--r--src/display/canvas-temporary-item.h5
-rw-r--r--src/display/canvas-text.cpp4
-rw-r--r--src/display/canvas-text.h16
-rw-r--r--src/display/curve.cpp2
-rw-r--r--src/display/curve.h2
-rw-r--r--src/display/display-forward.h20
-rw-r--r--src/display/gnome-canvas-acetate.cpp5
-rw-r--r--src/display/gnome-canvas-acetate.h19
-rw-r--r--src/display/grayscale.cpp95
-rw-r--r--src/display/grayscale.h40
-rw-r--r--src/display/guideline.cpp11
-rw-r--r--src/display/guideline.h8
-rw-r--r--src/display/nr-3dutils.cpp4
-rw-r--r--src/display/nr-3dutils.h2
-rw-r--r--src/display/nr-arena-glyphs.cpp10
-rw-r--r--src/display/nr-arena-glyphs.h25
-rw-r--r--src/display/nr-arena-group.cpp6
-rw-r--r--src/display/nr-arena-group.h6
-rw-r--r--src/display/nr-arena-image.cpp2
-rw-r--r--src/display/nr-arena-image.h2
-rw-r--r--src/display/nr-arena-item.cpp13
-rw-r--r--src/display/nr-arena-item.h12
-rw-r--r--src/display/nr-arena-shape.cpp5
-rw-r--r--src/display/nr-arena.cpp3
-rw-r--r--src/display/nr-arena.h1
-rw-r--r--src/display/nr-filter-blend.cpp2
-rw-r--r--src/display/nr-filter-blend.h2
-rw-r--r--src/display/nr-filter-colormatrix.cpp4
-rw-r--r--src/display/nr-filter-colormatrix.h4
-rw-r--r--src/display/nr-filter-component-transfer.cpp4
-rw-r--r--src/display/nr-filter-component-transfer.h4
-rw-r--r--src/display/nr-filter-composite.cpp2
-rw-r--r--src/display/nr-filter-composite.h2
-rw-r--r--src/display/nr-filter-convolve-matrix.cpp2
-rw-r--r--src/display/nr-filter-convolve-matrix.h2
-rw-r--r--src/display/nr-filter-diffuselighting.cpp8
-rw-r--r--src/display/nr-filter-diffuselighting.h2
-rw-r--r--src/display/nr-filter-displacement-map.cpp6
-rw-r--r--src/display/nr-filter-displacement-map.h2
-rw-r--r--src/display/nr-filter-flood.cpp7
-rw-r--r--src/display/nr-filter-flood.h4
-rw-r--r--src/display/nr-filter-gaussian.cpp51
-rw-r--r--src/display/nr-filter-gaussian.h4
-rw-r--r--src/display/nr-filter-image.cpp22
-rw-r--r--src/display/nr-filter-image.h7
-rw-r--r--src/display/nr-filter-merge.cpp2
-rw-r--r--src/display/nr-filter-merge.h2
-rw-r--r--src/display/nr-filter-morphology.cpp4
-rw-r--r--src/display/nr-filter-morphology.h2
-rw-r--r--src/display/nr-filter-offset.cpp6
-rw-r--r--src/display/nr-filter-offset.h4
-rw-r--r--src/display/nr-filter-primitive.cpp114
-rw-r--r--src/display/nr-filter-primitive.h41
-rw-r--r--src/display/nr-filter-slot.cpp8
-rw-r--r--src/display/nr-filter-specularlighting.cpp10
-rw-r--r--src/display/nr-filter-specularlighting.h2
-rw-r--r--src/display/nr-filter-tile.cpp2
-rw-r--r--src/display/nr-filter-tile.h2
-rw-r--r--src/display/nr-filter-turbulence.cpp7
-rw-r--r--src/display/nr-filter-units.cpp36
-rw-r--r--src/display/nr-filter-units.h44
-rw-r--r--src/display/nr-filter.cpp10
-rw-r--r--src/display/nr-filter.h8
-rw-r--r--src/display/nr-light.cpp4
-rw-r--r--src/display/nr-light.h4
-rw-r--r--src/display/nr-svgfonts.cpp2
-rw-r--r--src/display/rendermode.h9
-rw-r--r--src/display/snap-indicator.h3
-rw-r--r--src/display/sodipodi-ctrl.cpp7
-rw-r--r--src/display/sodipodi-ctrl.h5
-rw-r--r--src/display/sodipodi-ctrlrect.cpp7
-rw-r--r--src/display/sodipodi-ctrlrect.h13
-rw-r--r--src/display/sp-canvas-group.h45
-rw-r--r--src/display/sp-canvas-item.h110
-rw-r--r--src/display/sp-canvas-util.cpp12
-rw-r--r--src/display/sp-canvas-util.h6
-rw-r--r--src/display/sp-canvas.cpp29
-rw-r--r--src/display/sp-canvas.h63
-rw-r--r--src/display/sp-ctrlline.cpp4
-rw-r--r--src/display/sp-ctrlline.h10
-rw-r--r--src/display/sp-ctrlpoint.cpp5
-rw-r--r--src/display/sp-ctrlpoint.h12
-rw-r--r--src/display/sp-ctrlquadr.cpp10
95 files changed, 823 insertions, 394 deletions
diff --git a/src/display/Makefile_insert b/src/display/Makefile_insert
index 916dd6dc3..fc7c8e9ab 100644
--- a/src/display/Makefile_insert
+++ b/src/display/Makefile_insert
@@ -23,9 +23,10 @@ ink_common_sources += \
display/canvas-text.h \
display/curve.cpp \
display/curve.h \
- display/display-forward.h \
display/gnome-canvas-acetate.cpp \
display/gnome-canvas-acetate.h \
+ display/grayscale.cpp \
+ display/grayscale.h \
display/guideline.cpp \
display/guideline.h \
display/nr-3dutils.cpp \
diff --git a/src/display/cairo-utils.cpp b/src/display/cairo-utils.cpp
index ed4de8afc..adf5dcb9a 100644
--- a/src/display/cairo-utils.cpp
+++ b/src/display/cairo-utils.cpp
@@ -18,7 +18,7 @@
#include <2geom/pathvector.h>
#include <2geom/bezier-curve.h>
#include <2geom/hvlinesegment.h>
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include <2geom/point.h>
#include <2geom/path.h>
#include <2geom/transforms.h>
@@ -73,7 +73,7 @@ CairoContext::CairoContext(cairo_t *obj, bool ref)
: Cairo::Context(obj, ref)
{}
-void CairoContext::transform(Geom::Matrix const &m)
+void CairoContext::transform(Geom::Affine const &m)
{
cairo_matrix_t cm;
cm.xx = m[0];
@@ -113,7 +113,7 @@ Cairo::RefPtr<CairoContext> CairoContext::create(Cairo::RefPtr<Cairo::Surface> c
* If optimize_stroke == false, the view Rect is not used.
*/
static void
-feed_curve_to_cairo(cairo_t *cr, Geom::Curve const &c, Geom::Matrix const & trans, Geom::Rect view, bool optimize_stroke)
+feed_curve_to_cairo(cairo_t *cr, Geom::Curve const &c, Geom::Affine const & trans, Geom::Rect view, bool optimize_stroke)
{
if( is_straight_curve(c) )
{
@@ -203,7 +203,7 @@ feed_path_to_cairo (cairo_t *ct, Geom::Path const &path)
/** Feeds path-creating calls to the cairo context translating them from the Path, with the given transform and shift */
static void
-feed_path_to_cairo (cairo_t *ct, Geom::Path const &path, Geom::Matrix trans, Geom::OptRect area, bool optimize_stroke, double stroke_width)
+feed_path_to_cairo (cairo_t *ct, Geom::Path const &path, Geom::Affine trans, Geom::OptRect area, bool optimize_stroke, double stroke_width)
{
if (!area)
return;
@@ -214,9 +214,9 @@ feed_path_to_cairo (cairo_t *ct, Geom::Path const &path, Geom::Matrix trans, Geo
Geom::Point shift = area->min();
Geom::Rect view = *area;
view.expandBy (stroke_width);
- view = view * (Geom::Matrix)Geom::Translate(-shift);
+ view = view * (Geom::Affine)Geom::Translate(-shift);
// Pass transformation to feed_curve, so that we don't need to create a whole new path.
- Geom::Matrix transshift(trans * Geom::Translate(-shift));
+ Geom::Affine transshift(trans * Geom::Translate(-shift));
Geom::Point initial = path.initialPoint() * transshift;
cairo_move_to(ct, initial[0], initial[1] );
@@ -251,7 +251,7 @@ feed_path_to_cairo (cairo_t *ct, Geom::Path const &path, Geom::Matrix trans, Geo
/** Feeds path-creating calls to the cairo context translating them from the PathVector, with the given transform and shift
* One must have done cairo_new_path(ct); before calling this function. */
void
-feed_pathvector_to_cairo (cairo_t *ct, Geom::PathVector const &pathv, Geom::Matrix trans, Geom::OptRect area, bool optimize_stroke, double stroke_width)
+feed_pathvector_to_cairo (cairo_t *ct, Geom::PathVector const &pathv, Geom::Affine trans, Geom::OptRect area, bool optimize_stroke, double stroke_width)
{
if (!area)
return;
@@ -288,7 +288,7 @@ ink_cairo_set_source_color(cairo_t *ct, SPColor const &c, double opacity)
cairo_set_source_rgba(ct, c.v.c[0], c.v.c[1], c.v.c[2], opacity);
}
-void ink_matrix_to_2geom(Geom::Matrix &m, cairo_matrix_t const &cm)
+void ink_matrix_to_2geom(Geom::Affine &m, cairo_matrix_t const &cm)
{
m[0] = cm.xx;
m[2] = cm.xy;
@@ -298,7 +298,7 @@ void ink_matrix_to_2geom(Geom::Matrix &m, cairo_matrix_t const &cm)
m[5] = cm.y0;
}
-void ink_matrix_to_cairo(cairo_matrix_t &cm, Geom::Matrix const &m)
+void ink_matrix_to_cairo(cairo_matrix_t &cm, Geom::Affine const &m)
{
cm.xx = m[0];
cm.xy = m[2];
@@ -309,7 +309,7 @@ void ink_matrix_to_cairo(cairo_matrix_t &cm, Geom::Matrix const &m)
}
void
-ink_cairo_transform(cairo_t *ct, Geom::Matrix const &m)
+ink_cairo_transform(cairo_t *ct, Geom::Affine const &m)
{
cairo_matrix_t cm;
ink_matrix_to_cairo(cm, m);
@@ -317,7 +317,7 @@ ink_cairo_transform(cairo_t *ct, Geom::Matrix const &m)
}
void
-ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Matrix const &m)
+ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Affine const &m)
{
cairo_matrix_t cm;
ink_matrix_to_cairo(cm, m);
diff --git a/src/display/cairo-utils.h b/src/display/cairo-utils.h
index d563cfb75..d5c84810c 100644
--- a/src/display/cairo-utils.h
+++ b/src/display/cairo-utils.h
@@ -69,7 +69,7 @@ class CairoContext : public Cairo::Context {
public:
CairoContext(cairo_t *obj, bool ref = false);
- void transform(Geom::Matrix const &m);
+ void transform(Geom::Affine const &m);
void set_source_rgba32(guint32 color);
void append_path(Geom::PathVector const &pv);
@@ -80,12 +80,12 @@ public:
void ink_cairo_set_source_color(cairo_t *ct, SPColor const &color, double opacity);
void ink_cairo_set_source_rgba32(cairo_t *ct, guint32 rgba);
-void ink_cairo_transform(cairo_t *ct, Geom::Matrix const &m);
-void ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Matrix const &m);
+void ink_cairo_transform(cairo_t *ct, Geom::Affine const &m);
+void ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Affine const &m);
void ink_cairo_set_source_argb32_pixbuf(cairo_t *ct, GdkPixbuf *pb, double x, double y);
-void ink_matrix_to_2geom(Geom::Matrix &, cairo_matrix_t const &);
-void ink_matrix_to_cairo(cairo_matrix_t &, Geom::Matrix const &);
+void ink_matrix_to_2geom(Geom::Affine &, cairo_matrix_t const &);
+void ink_matrix_to_cairo(cairo_matrix_t &, Geom::Affine const &);
cairo_surface_t *ink_cairo_surface_copy(cairo_surface_t *s);
cairo_surface_t *ink_cairo_surface_create_identical(cairo_surface_t *s);
@@ -121,7 +121,7 @@ unpremul_alpha(guint32 color, guint32 alpha)
}
// TODO: move those to 2Geom
-void feed_pathvector_to_cairo (cairo_t *ct, Geom::PathVector const &pathv, Geom::Matrix trans, Geom::OptRect area, bool optimize_stroke, double stroke_width);
+void feed_pathvector_to_cairo (cairo_t *ct, Geom::PathVector const &pathv, Geom::Affine trans, Geom::OptRect area, bool optimize_stroke, double stroke_width);
void feed_pathvector_to_cairo (cairo_t *ct, Geom::PathVector const &pathv);
#define EXTRACT_ARGB32(px,a,r,g,b) \
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index c681ea5a0..884e604be 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -1,5 +1,3 @@
-#define __SP_CANVAS_ARENA_C__
-
/*
* RGBA display list system for inkscape
*
@@ -31,7 +29,7 @@ static void sp_canvas_arena_class_init(SPCanvasArenaClass *klass);
static void sp_canvas_arena_init(SPCanvasArena *group);
static void sp_canvas_arena_destroy(GtkObject *object);
-static void sp_canvas_arena_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_canvas_arena_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
static gint sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event);
@@ -136,7 +134,7 @@ sp_canvas_arena_destroy (GtkObject *object)
}
static void
-sp_canvas_arena_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCanvasArena *arena = SP_CANVAS_ARENA (item);
diff --git a/src/display/canvas-arena.h b/src/display/canvas-arena.h
index df484197a..6db87b675 100644
--- a/src/display/canvas-arena.h
+++ b/src/display/canvas-arena.h
@@ -16,6 +16,7 @@
#include <cairo.h>
#include <2geom/rect.h>
#include "display/sp-canvas.h"
+#include "display/sp-canvas-item.h"
#include "display/nr-arena-item.h"
G_BEGIN_DECLS
diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp
index c4fdb2452..a9893f09d 100644
--- a/src/display/canvas-axonomgrid.cpp
+++ b/src/display/canvas-axonomgrid.cpp
@@ -1,5 +1,3 @@
-#define CANVAS_AXONOMGRID_C
-
/*
* Copyright (C) 2006-2008 Johan Engelen <johan@shouraizou.nl>
*/
@@ -19,6 +17,7 @@
#include "2geom/line.h"
#include "desktop.h"
+#include "canvas-grid.h"
#include "desktop-handles.h"
#include "display/cairo-utils.h"
#include "display/canvas-axonomgrid.h"
@@ -475,7 +474,7 @@ CanvasAxonomGrid::updateWidgets()
void
-CanvasAxonomGrid::Update (Geom::Matrix const &affine, unsigned int /*flags*/)
+CanvasAxonomGrid::Update (Geom::Affine const &affine, unsigned int /*flags*/)
{
ow = origin * affine;
sw = Geom::Point(fabs(affine[0]),fabs(affine[3]));
diff --git a/src/display/canvas-axonomgrid.h b/src/display/canvas-axonomgrid.h
index 58185e2e6..282524c74 100644
--- a/src/display/canvas-axonomgrid.h
+++ b/src/display/canvas-axonomgrid.h
@@ -34,7 +34,7 @@ public:
CanvasAxonomGrid(SPNamedView * nv, Inkscape::XML::Node * in_repr, SPDocument * in_doc);
virtual ~CanvasAxonomGrid();
- void Update (Geom::Matrix const &affine, unsigned int flags);
+ void Update (Geom::Affine const &affine, unsigned int flags);
void Render (SPCanvasBuf *buf);
void readRepr();
diff --git a/src/display/canvas-bpath.cpp b/src/display/canvas-bpath.cpp
index 082e6d44e..f86743744 100644
--- a/src/display/canvas-bpath.cpp
+++ b/src/display/canvas-bpath.cpp
@@ -1,5 +1,3 @@
-#define __SP_CANVAS_BPATH_C__
-
/*
* Simple bezier bpath CanvasItem for inkscape
*
@@ -15,7 +13,12 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+#include <sstream>
+#include <string.h>
+#include "desktop.h"
+
#include "color.h"
+#include "display/sp-canvas-group.h"
#include "display/sp-canvas-util.h"
#include "display/canvas-bpath.h"
#include "display/display-forward.h"
@@ -23,17 +26,13 @@
#include "display/cairo-utils.h"
#include "helper/geom.h"
-#include <sstream>
-#include <string.h>
-#include <desktop.h>
-
void nr_pixblock_render_bpath_rgba (Shape* theS,uint32_t color,NRRectL &area,char* destBuf,int stride);
static void sp_canvas_bpath_class_init (SPCanvasBPathClass *klass);
static void sp_canvas_bpath_init (SPCanvasBPath *path);
static void sp_canvas_bpath_destroy (GtkObject *object);
-static void sp_canvas_bpath_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_canvas_bpath_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvas_bpath_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_canvas_bpath_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
@@ -102,7 +101,7 @@ sp_canvas_bpath_destroy (GtkObject *object)
}
static void
-sp_canvas_bpath_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_canvas_bpath_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCanvasBPath *cbp = SP_CANVAS_BPATH (item);
diff --git a/src/display/canvas-bpath.h b/src/display/canvas-bpath.h
index 65ad4aa00..7f8b75dfe 100644
--- a/src/display/canvas-bpath.h
+++ b/src/display/canvas-bpath.h
@@ -1,13 +1,15 @@
-#ifndef __SP_CANVAS_BPATH_H__
-#define __SP_CANVAS_BPATH_H__
+#ifndef SEEN_SP_CANVAS_BPATH_H
+#define SEEN_SP_CANVAS_BPATH_H
/*
* Simple bezier bpath CanvasItem for inkscape
*
* Authors:
* Lauris Kaplinski <lauris@ximian.com>
+ * Jon A. Cruz <jon@joncruz.org>
*
* Copyright (C) 2001 Lauris Kaplinski and Ximian, Inc.
+ * Copyright (C) 2010 authors
*
* Released under GNU GPL
*
@@ -15,10 +17,11 @@
#include <glib/gtypes.h>
-#include <display/sp-canvas.h>
+#include "sp-canvas-item.h"
struct SPCanvasBPath;
struct SPCanvasBPathClass;
+struct SPCanvasGroup;
struct SPCurve;
#define SP_TYPE_CANVAS_BPATH (sp_canvas_bpath_get_type ())
@@ -64,7 +67,7 @@ struct SPCanvasBPath {
/* Line def */
SPCurve *curve;
- Geom::Matrix affine;
+ Geom::Affine affine;
/* Fill attributes */
guint32 fill_rgba;
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 86897baaa..82ea036f6 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -22,6 +22,7 @@
#include "display/canvas-grid.h"
#include "display/display-forward.h"
#include "display/sp-canvas-util.h"
+#include "display/sp-canvas-group.h"
#include "document.h"
#include "helper/units.h"
#include "inkscape.h"
@@ -52,7 +53,7 @@ static void grid_canvasitem_class_init (GridCanvasItemClass *klass);
static void grid_canvasitem_init (GridCanvasItem *grid);
static void grid_canvasitem_destroy (GtkObject *object);
-static void grid_canvasitem_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void grid_canvasitem_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void grid_canvasitem_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass * parent_class;
@@ -124,7 +125,7 @@ grid_canvasitem_render (SPCanvasItem * item, SPCanvasBuf * buf)
}
static void
-grid_canvasitem_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+grid_canvasitem_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
GridCanvasItem *gridcanvasitem = INKSCAPE_GRID_CANVASITEM (item);
@@ -803,7 +804,7 @@ CanvasXYGrid::updateWidgets()
void
-CanvasXYGrid::Update (Geom::Matrix const &affine, unsigned int /*flags*/)
+CanvasXYGrid::Update (Geom::Affine const &affine, unsigned int /*flags*/)
{
ow = origin * affine;
sw = spacing * affine;
diff --git a/src/display/canvas-grid.h b/src/display/canvas-grid.h
index a11d77d1d..f386fe05e 100644
--- a/src/display/canvas-grid.h
+++ b/src/display/canvas-grid.h
@@ -14,7 +14,7 @@
#include <gtkmm/box.h>
#include <gtkmm.h>
-#include "display/sp-canvas.h"
+#include "sp-canvas-item.h"
#include "xml/repr.h"
#include "ui/widget/color-picker.h"
#include "ui/widget/scalar-unit.h"
@@ -26,6 +26,7 @@
struct SPDesktop;
struct SPNamedView;
+struct SPCanvasBuf;
class SPDocument;
namespace Inkscape {
@@ -78,7 +79,7 @@ public:
GridCanvasItem * createCanvasItem(SPDesktop * desktop);
- virtual void Update (Geom::Matrix const &affine, unsigned int flags) = 0;
+ virtual void Update (Geom::Affine const &affine, unsigned int flags) = 0;
virtual void Render (SPCanvasBuf *buf) = 0;
virtual void readRepr() = 0;
@@ -128,7 +129,7 @@ public:
CanvasXYGrid(SPNamedView * nv, Inkscape::XML::Node * in_repr, SPDocument * in_doc);
virtual ~CanvasXYGrid();
- void Update (Geom::Matrix const &affine, unsigned int flags);
+ void Update (Geom::Affine const &affine, unsigned int flags);
void Render (SPCanvasBuf *buf);
void readRepr();
diff --git a/src/display/canvas-temporary-item-list.h b/src/display/canvas-temporary-item-list.h
index 4d712e216..47556b9f1 100644
--- a/src/display/canvas-temporary-item-list.h
+++ b/src/display/canvas-temporary-item-list.h
@@ -13,9 +13,10 @@
*/
#include "forward.h"
-#include "display/display-forward.h"
#include <list>
+struct SPCanvasItem;
+
namespace Inkscape {
namespace Display {
diff --git a/src/display/canvas-temporary-item.h b/src/display/canvas-temporary-item.h
index 5077fb55b..b73907bad 100644
--- a/src/display/canvas-temporary-item.h
+++ b/src/display/canvas-temporary-item.h
@@ -12,9 +12,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display/display-forward.h"
+#include <stddef.h>
#include <sigc++/sigc++.h>
+#include <glib/gtypes.h>
+
+struct SPCanvasItem;
namespace Inkscape {
namespace Display {
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp
index 682b15eb8..54cbe5da8 100644
--- a/src/display/canvas-text.cpp
+++ b/src/display/canvas-text.cpp
@@ -31,7 +31,7 @@ static void sp_canvastext_class_init (SPCanvasTextClass *klass);
static void sp_canvastext_init (SPCanvasText *canvastext);
static void sp_canvastext_destroy (GtkObject *object);
-static void sp_canvastext_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class_ct;
@@ -131,7 +131,7 @@ sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf)
}
static void
-sp_canvastext_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCanvasText *cl = SP_CANVASTEXT (item);
diff --git a/src/display/canvas-text.h b/src/display/canvas-text.h
index e5d634985..9a6a93eb4 100644
--- a/src/display/canvas-text.h
+++ b/src/display/canvas-text.h
@@ -1,5 +1,5 @@
-#ifndef __SP_CANVASTEXT_H__
-#define __SP_CANVASTEXT_H__
+#ifndef SEEN_SP_CANVASTEXT_H
+#define SEEN_SP_CANVASTEXT_H
/*
* Canvas text.
@@ -14,10 +14,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-/*
- * FIXME: The following code should actually be in a separate file called display/canvas-text.h. It
- * temporarily had to be moved here because of linker errors.
- */
+#include "sp-canvas-item.h"
struct SPItem;
struct SPDesktop;
@@ -26,7 +23,7 @@ struct SPDesktop;
#define SP_CANVASTEXT(obj) (GTK_CHECK_CAST ((obj), SP_TYPE_CANVASTEXT, SPCanvasText))
#define SP_IS_CANVASTEXT(obj) (GTK_CHECK_TYPE ((obj), SP_TYPE_CANVASTEXT))
-struct SPCanvasText : public SPCanvasItem{
+struct SPCanvasText : public SPCanvasItem {
SPItem *item; // the item to which this line belongs in some sense; may be NULL for some users
guint32 rgba;
guint32 rgba_stroke;
@@ -34,7 +31,7 @@ struct SPCanvasText : public SPCanvasItem{
gchar* text;
Geom::Point s;
- Geom::Matrix affine;
+ Geom::Affine affine;
double fontsize;
double anchor_x;
double anchor_y;
@@ -53,7 +50,8 @@ void sp_canvastext_set_number_as_text (SPCanvasText *ct, int num);
void sp_canvastext_set_fontsize (SPCanvasText *ct, double size);
void sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y);
-#endif
+#endif // SEEN_SP_CANVASTEXT_H
+
/*
diff --git a/src/display/curve.cpp b/src/display/curve.cpp
index 303d1bb4d..5c18324eb 100644
--- a/src/display/curve.cpp
+++ b/src/display/curve.cpp
@@ -180,7 +180,7 @@ SPCurve::split() const
* Transform all paths in curve using matrix.
*/
void
-SPCurve::transform(Geom::Matrix const &m)
+SPCurve::transform(Geom::Affine const &m)
{
_pathv *= m;
}
diff --git a/src/display/curve.h b/src/display/curve.h
index e6387a9f0..ec828e674 100644
--- a/src/display/curve.h
+++ b/src/display/curve.h
@@ -67,7 +67,7 @@ public:
void closepath_current();
void backspace();
- void transform(Geom::Matrix const &m);
+ void transform(Geom::Affine const &m);
void stretch_endpoints(Geom::Point const &, Geom::Point const &);
void move_endpoints(Geom::Point const &, Geom::Point const &);
void last_point_additive_move(Geom::Point const & p);
diff --git a/src/display/display-forward.h b/src/display/display-forward.h
index 25c4a6e3d..bc7013214 100644
--- a/src/display/display-forward.h
+++ b/src/display/display-forward.h
@@ -18,26 +18,6 @@ namespace Display {
}
}
-#define SP_TYPE_CANVAS_ITEM (sp_canvas_item_get_type())
-#define SP_CANVAS_ITEM(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS_ITEM, SPCanvasItem))
-#define SP_IS_CANVAS_ITEM(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS_ITEM))
-#define SP_CANVAS_ITEM_GET_CLASS(o) (GTK_CHECK_GET_CLASS((o), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
-
-GType sp_canvas_item_get_type();
-
-#define SP_TYPE_CANVAS_GROUP (sp_canvas_group_get_type())
-#define SP_CANVAS_GROUP(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS_GROUP, SPCanvasGroup))
-#define SP_IS_CANVAS_GROUP(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS_GROUP))
-
-GType sp_canvas_group_get_type();
-
-#define SP_TYPE_CANVAS (sp_canvas_get_type())
-#define SP_CANVAS(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS, SPCanvas))
-#define SP_IS_CANVAS(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS))
-
-GType sp_canvas_get_type();
-
-
#endif /* !SEEN_DISPLAY_DISPLAY_FORWARD_H */
/*
diff --git a/src/display/gnome-canvas-acetate.cpp b/src/display/gnome-canvas-acetate.cpp
index fdb137e27..b86892e32 100644
--- a/src/display/gnome-canvas-acetate.cpp
+++ b/src/display/gnome-canvas-acetate.cpp
@@ -14,14 +14,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display-forward.h"
#include "gnome-canvas-acetate.h"
static void sp_canvas_acetate_class_init (SPCanvasAcetateClass *klass);
static void sp_canvas_acetate_init (SPCanvasAcetate *acetate);
static void sp_canvas_acetate_destroy (GtkObject *object);
-static void sp_canvas_acetate_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_canvas_acetate_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static double sp_canvas_acetate_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
static SPCanvasItemClass *parent_class;
@@ -82,7 +81,7 @@ sp_canvas_acetate_destroy (GtkObject *object)
}
static void
-sp_canvas_acetate_update( SPCanvasItem *item, Geom::Matrix const &/*affine*/, unsigned int /*flags*/ )
+sp_canvas_acetate_update( SPCanvasItem *item, Geom::Affine const &/*affine*/, unsigned int /*flags*/ )
{
item->x1 = -G_MAXINT;
item->y1 = -G_MAXINT;
diff --git a/src/display/gnome-canvas-acetate.h b/src/display/gnome-canvas-acetate.h
index 40574e1bf..8c284291c 100644
--- a/src/display/gnome-canvas-acetate.h
+++ b/src/display/gnome-canvas-acetate.h
@@ -1,5 +1,5 @@
-#ifndef __SP_CANVAS_ACETATE_H__
-#define __SP_CANVAS_ACETATE_H__
+#ifndef SEEN_SP_CANVAS_ACETATE_H
+#define SEEN_SP_CANVAS_ACETATE_H
/*
* Infinite invisible canvas item
@@ -16,7 +16,7 @@
*/
#include <glib/gtypes.h>
-#include "display/sp-canvas.h"
+#include "display/sp-canvas-item.h"
#define GNOME_TYPE_CANVAS_ACETATE (sp_canvas_acetate_get_type ())
@@ -38,4 +38,15 @@ GtkType sp_canvas_acetate_get_type (void);
-#endif
+#endif // SEEN_SP_CANVAS_ACETATE_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/display/grayscale.cpp b/src/display/grayscale.cpp
new file mode 100644
index 000000000..37f2b255c
--- /dev/null
+++ b/src/display/grayscale.cpp
@@ -0,0 +1,95 @@
+/** \file
+ * Provide methods to calculate grayscale values (e.g. convert rgba value to grayscale rgba value)
+ */
+
+/*
+ * Author:
+ * Johan Engelen <goejendaagh@zonnet.nl>
+ *
+ * Copyright (C) 2011 Author
+ *
+ * Released under GNU GPL
+ */
+
+#include "display/grayscale.h"
+#include "color.h"
+
+// for activeDesktopIsGrayscale:
+#include "display/rendermode.h"
+#include "inkscape.h"
+#include "desktop.h"
+
+namespace Grayscale {
+
+guint32 process(guint32 rgba) {
+ return process(SP_RGBA32_R_U(rgba), SP_RGBA32_G_U(rgba), SP_RGBA32_B_U(rgba), SP_RGBA32_A_U(rgba));
+}
+
+guint32 process(guchar r, guchar g, guchar b, guchar a) {
+ float red_factor = 0.3;
+ float green_factor = 0.59;
+ float blue_factor = 0.11;
+
+ /** To reduce banding in gradients, this calculation is tweaked a bit
+ * by outputing blue+1 or red+1 or both. The luminance is calculated
+ * times 4. Then last two bits are used to determine if red and/or blue
+ * can be increased by one. Then these two bits are discarded.
+ * So the output color it still looks gray, but has more than 256 steps.
+ * The assumption is that the eye is most sensitive to green, then red, then blue.
+ * (hope this trick works :-) Johan)
+ */
+
+ guint32 luminance = ( red_factor * (r << 3)
+ + green_factor * (g << 3)
+ + blue_factor * (b << 3) );
+ unsigned blue_plus_one = (luminance & 0x01) ? 1 : 0;
+ unsigned red_plus_one = (luminance & 0x02) ? 1 : 0;
+ unsigned green_plus_one = (luminance & 0x04) ? 1 : 0;
+ luminance = luminance >> 3;
+
+ if (luminance >= 0xff) {
+ return SP_RGBA32_U_COMPOSE(0xff, 0xff, 0xff, a);
+ } else {
+ return SP_RGBA32_U_COMPOSE(luminance + red_plus_one, luminance + green_plus_one, luminance + blue_plus_one, a);
+ }
+}
+
+guchar luminance(guchar r, guchar g, guchar b) {
+ guint32 luminance = ( red_factor * r
+ + green_factor * g
+ + blue_factor * b );
+ if (luminance > 0xff) {
+ luminance = 0xff;
+ }
+
+ return luminance & 0xff;
+}
+
+/** @brief Use this method if there is no other way to find out if grayscale view or not
+ *
+ * In some cases, the choice between normal or grayscale is so deep in the code hierarchy,
+ * that it is not possible to determine whether grayscale is desired or not, without using
+ * the global SP_ACTIVE_DESKTOP macro. Then use this method, so we know where the abuse is
+ * happening...
+ */
+bool activeDesktopIsGrayscale() {
+ if (SP_ACTIVE_DESKTOP) {
+ return (SP_ACTIVE_DESKTOP->getColorMode() == Inkscape::COLORRENDERMODE_GRAYSCALE);
+ } else {
+ return false;
+ }
+}
+
+
+};
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/display/grayscale.h b/src/display/grayscale.h
new file mode 100644
index 000000000..855c9e465
--- /dev/null
+++ b/src/display/grayscale.h
@@ -0,0 +1,40 @@
+#ifndef SEEN_DISPLAY_GRAYSCALE_H
+#define SEEN_DISPLAY_GRAYSCALE_H
+
+/** \file
+ * Provide methods to calculate grayscale values (e.g. convert rgba value to grayscale rgba value)
+ *
+ * Author:
+ * Johan Engelen <goejendaagh@zonnet.nl>
+ *
+ * Copyright (C) 2011 Author
+ *
+ * Released under GNU GPL
+ */
+
+#include <gdk/gdktypes.h>
+
+namespace Grayscale {
+ guint32 process(guint32 rgba);
+ guint32 process(guchar r, guchar g, guchar b, guchar a);
+ guchar luminance(guchar r, guchar g, guchar b);
+
+ const float red_factor = 0.3;
+ const float green_factor = 0.59;
+ const float blue_factor = 0.11;
+
+ bool activeDesktopIsGrayscale();
+};
+
+#endif /* !SEEN_DISPLAY_GRAYSCALE_H */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index 75c201d78..072ae69f1 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -1,5 +1,3 @@
-#define __SP_GUIDELINE_C__
-
/*
* Horizontal/vertical but can also be angled line
*
@@ -16,7 +14,6 @@
*/
#include <2geom/transforms.h>
-#include "display-forward.h"
#include "sp-canvas-util.h"
#include "sp-ctrlpoint.h"
#include "guideline.h"
@@ -26,7 +23,7 @@ static void sp_guideline_class_init(SPGuideLineClass *c);
static void sp_guideline_init(SPGuideLine *guideline);
static void sp_guideline_destroy(GtkObject *object);
-static void sp_guideline_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
@@ -162,7 +159,7 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
cairo_restore(buf->ct);
}
-static void sp_guideline_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPGuideLine *gl = SP_GUIDELINE(item);
@@ -222,8 +219,8 @@ SPCanvasItem *sp_guideline_new(SPCanvasGroup *parent, Geom::Point point_on_line,
void sp_guideline_set_position(SPGuideLine *gl, Geom::Point point_on_line)
{
- sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl), Geom::Matrix(Geom::Translate(point_on_line)));
- sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl->origin), Geom::Matrix(Geom::Translate(point_on_line)));
+ sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl), Geom::Affine(Geom::Translate(point_on_line)));
+ sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl->origin), Geom::Affine(Geom::Translate(point_on_line)));
}
void sp_guideline_set_normal(SPGuideLine *gl, Geom::Point normal_to_line)
diff --git a/src/display/guideline.h b/src/display/guideline.h
index a6ce57113..9654d04a1 100644
--- a/src/display/guideline.h
+++ b/src/display/guideline.h
@@ -1,5 +1,5 @@
-#ifndef __SP_GUIDELINE_H__
-#define __SP_GUIDELINE_H__
+#ifndef SEEN_SP_GUIDELINE_H
+#define SEEN_SP_GUIDELINE_H
/*
* The visual representation of SPGuide.
@@ -14,8 +14,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "sp-canvas.h"
#include <2geom/point.h>
+#include "sp-canvas-item.h"
#define SP_TYPE_GUIDELINE (sp_guideline_get_type())
#define SP_GUIDELINE(o) (GTK_CHECK_CAST((o), SP_TYPE_GUIDELINE, SPGuideLine))
@@ -53,7 +53,7 @@ void sp_guideline_set_color(SPGuideLine *gl, unsigned int rgba);
void sp_guideline_set_sensitive(SPGuideLine *gl, int sensitive);
void sp_guideline_delete(SPGuideLine *gl);
-#endif
+#endif // SEEN_SP_GUIDELINE_H
/*
Local Variables:
diff --git a/src/display/nr-3dutils.cpp b/src/display/nr-3dutils.cpp
index 4518269af..eb6858374 100644
--- a/src/display/nr-3dutils.cpp
+++ b/src/display/nr-3dutils.cpp
@@ -14,11 +14,11 @@
#include "display/nr-3dutils.h"
#include <cmath>
#include <2geom/point.h>
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
namespace NR {
-void convert_coord(gdouble &x, gdouble &y, gdouble &z, Geom::Matrix const &trans) {
+void convert_coord(gdouble &x, gdouble &y, gdouble &z, Geom::Affine const &trans) {
Geom::Point p = Geom::Point(x, y);
p *= trans;
x = p[Geom::X];
diff --git a/src/display/nr-3dutils.h b/src/display/nr-3dutils.h
index 5651b2246..4e98c2374 100644
--- a/src/display/nr-3dutils.h
+++ b/src/display/nr-3dutils.h
@@ -90,7 +90,7 @@ void normalized_sum(Fvector &r, const Fvector &a, const Fvector &b);
* \param z a reference to a z coordinate
* \param z a reference to a transformation matrix
*/
-void convert_coord(gdouble &x, gdouble &y, gdouble &z, Geom::Matrix const &trans);
+void convert_coord(gdouble &x, gdouble &y, gdouble &z, Geom::Affine const &trans);
} /* namespace NR */
diff --git a/src/display/nr-arena-glyphs.cpp b/src/display/nr-arena-glyphs.cpp
index 571f777fe..5f21ceaa9 100644
--- a/src/display/nr-arena-glyphs.cpp
+++ b/src/display/nr-arena-glyphs.cpp
@@ -17,7 +17,7 @@
# include <config.h>
#endif
#include "libnr/nr-convert2geom.h"
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include "style.h"
#include "display/nr-arena.h"
#include "display/nr-arena-glyphs.h"
@@ -115,7 +115,7 @@ nr_arena_glyphs_update(NRArenaItem *item, NRRectL */*area*/, NRGC *gc, guint /*s
return NR_ARENA_ITEM_STATE_ALL;
Geom::OptRect b;
- Geom::Matrix t = glyphs->g_transform * gc->transform;
+ Geom::Affine t = glyphs->g_transform * gc->transform;
glyphs->x = t[4];
glyphs->y = t[5];
@@ -183,7 +183,7 @@ nr_arena_glyphs_pick(NRArenaItem *item, Geom::Point p, gdouble delta, unsigned i
}
void
-nr_arena_glyphs_set_path(NRArenaGlyphs *glyphs, SPCurve */*curve*/, unsigned int /*lieutenant*/, font_instance *font, gint glyph, Geom::Matrix const *transform)
+nr_arena_glyphs_set_path(NRArenaGlyphs *glyphs, SPCurve */*curve*/, unsigned int /*lieutenant*/, font_instance *font, gint glyph, Geom::Affine const *transform)
{
nr_return_if_fail(glyphs != NULL);
nr_return_if_fail(NR_IS_ARENA_GLYPHS(glyphs));
@@ -308,7 +308,7 @@ nr_arena_glyphs_group_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPi
NRArenaGlyphs *g = NR_ARENA_GLYPHS(child);
Geom::PathVector const * pathv = g->font->PathVector(g->glyph);
- Geom::Matrix transform = g->g_transform * group->ctm;
+ Geom::Affine transform = g->g_transform * group->ctm;
cairo_new_path(ct);
ink_cairo_transform(ct, transform);
@@ -397,7 +397,7 @@ nr_arena_glyphs_group_clear(NRArenaGlyphsGroup *sg)
}
void
-nr_arena_glyphs_group_add_component(NRArenaGlyphsGroup *sg, font_instance *font, int glyph, Geom::Matrix const &transform)
+nr_arena_glyphs_group_add_component(NRArenaGlyphsGroup *sg, font_instance *font, int glyph, Geom::Affine const &transform)
{
NRArenaGroup *group;
diff --git a/src/display/nr-arena-glyphs.h b/src/display/nr-arena-glyphs.h
index f0580282f..6f8a0bde5 100644
--- a/src/display/nr-arena-glyphs.h
+++ b/src/display/nr-arena-glyphs.h
@@ -1,5 +1,5 @@
-#ifndef __NR_ARENA_GLYPHS_H__
-#define __NR_ARENA_GLYPHS_H__
+#ifndef SEEN_NR_ARENA_GLYPHS_H
+#define SEEN_NR_ARENA_GLYPHS_H
/*
* RGBA display list system for inkscape
@@ -26,13 +26,15 @@
#define test_glyph_liv
+struct SPCurve;
class Shape;
NRType nr_arena_glyphs_get_type (void);
struct NRArenaGlyphs : public NRArenaItem {
/* Glyphs data */
- Geom::Matrix g_transform;
+ Geom::Affine g_transform;
+
font_instance *font;
gint glyph;
float x, y;
@@ -51,7 +53,7 @@ struct NRArenaGlyphsClass {
void nr_arena_glyphs_set_path ( NRArenaGlyphs *glyphs,
SPCurve *curve, unsigned int lieutenant,
font_instance *font, int glyph,
- Geom::Matrix const *transform );
+ Geom::Affine const *transform );
void nr_arena_glyphs_set_style (NRArenaGlyphs *glyphs, SPStyle *style);
/* Integrated group of component glyphss */
@@ -86,10 +88,21 @@ struct NRArenaGlyphsGroupClass {
void nr_arena_glyphs_group_clear (NRArenaGlyphsGroup *group);
-void nr_arena_glyphs_group_add_component (NRArenaGlyphsGroup *group, font_instance *font, int glyph, Geom::Matrix const &transform);
+void nr_arena_glyphs_group_add_component (NRArenaGlyphsGroup *group, font_instance *font, int glyph, Geom::Affine const &transform);
void nr_arena_glyphs_group_set_style (NRArenaGlyphsGroup *group, SPStyle *style);
void nr_arena_glyphs_group_set_paintbox (NRArenaGlyphsGroup *group, const NRRect *pbox);
-#endif
+#endif // SEEN_NR_ARENA_GLYPHS_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/display/nr-arena-group.cpp b/src/display/nr-arena-group.cpp
index 7ad24bf70..97f92d02d 100644
--- a/src/display/nr-arena-group.cpp
+++ b/src/display/nr-arena-group.cpp
@@ -269,13 +269,13 @@ nr_arena_group_set_transparent (NRArenaGroup *group, unsigned int transparent)
group->transparent = transparent;
}
-void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Matrix const &t)
+void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Affine const &t)
{
- Geom::Matrix nt(t);
+ Geom::Affine nt(t);
nr_arena_group_set_child_transform(group, &nt);
}
-void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Matrix const *t)
+void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Affine const *t)
{
if (!t) t = &GEOM_MATRIX_IDENTITY;
diff --git a/src/display/nr-arena-group.h b/src/display/nr-arena-group.h
index 4579d068f..58394643c 100644
--- a/src/display/nr-arena-group.h
+++ b/src/display/nr-arena-group.h
@@ -26,7 +26,7 @@ struct NRArenaGroup : public NRArenaItem{
unsigned int transparent : 1;
NRArenaItem *children;
NRArenaItem *last;
- Geom::Matrix child_transform;
+ Geom::Affine child_transform;
SPStyle *style;
static NRArenaGroup *create(NRArena *arena) {
@@ -42,8 +42,8 @@ struct NRArenaGroupClass {
void nr_arena_group_set_transparent(NRArenaGroup *group, unsigned int transparent);
-void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Matrix const &t);
-void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Matrix const *t);
+void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Affine const &t);
+void nr_arena_group_set_child_transform(NRArenaGroup *group, Geom::Affine const *t);
void nr_arena_group_set_style(NRArenaGroup *group, SPStyle *style);
#endif
diff --git a/src/display/nr-arena-image.cpp b/src/display/nr-arena-image.cpp
index 9913fd08a..321d72ec1 100644
--- a/src/display/nr-arena-image.cpp
+++ b/src/display/nr-arena-image.cpp
@@ -163,7 +163,7 @@ nr_arena_image_render( cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock
cairo_set_source_surface(ct, image->surface, 0, 0);
cairo_matrix_t tt;
- Geom::Matrix total;
+ Geom::Affine total;
cairo_get_matrix(ct, &tt);
ink_matrix_to_2geom(total, tt);
diff --git a/src/display/nr-arena-image.h b/src/display/nr-arena-image.h
index aaf7a5d59..6fa9223dd 100644
--- a/src/display/nr-arena-image.h
+++ b/src/display/nr-arena-image.h
@@ -28,7 +28,7 @@ struct NRArenaImage : public NRArenaItem {
GdkPixbuf *pixbuf;
cairo_surface_t *surface;
- Geom::Matrix ctm;
+ Geom::Affine ctm;
Geom::Rect clipbox;
double ox, oy;
double sx, sy;
diff --git a/src/display/nr-arena-item.cpp b/src/display/nr-arena-item.cpp
index a2a959415..8787c1033 100644
--- a/src/display/nr-arena-item.cpp
+++ b/src/display/nr-arena-item.cpp
@@ -329,7 +329,6 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area
bool outline = (item->arena->rendermode == Inkscape::RENDERMODE_OUTLINE);
bool filter = (item->arena->rendermode != Inkscape::RENDERMODE_OUTLINE &&
item->arena->rendermode != Inkscape::RENDERMODE_NO_FILTERS);
- //bool print_colors = (item->arena->rendermode == Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW);
nr_return_val_if_fail (item != NULL, NR_ARENA_ITEM_STATE_INVALID);
nr_return_val_if_fail (NR_IS_ARENA_ITEM (item),
@@ -634,14 +633,14 @@ nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child)
}
void
-nr_arena_item_set_transform (NRArenaItem *item, Geom::Matrix const &transform)
+nr_arena_item_set_transform (NRArenaItem *item, Geom::Affine const &transform)
{
- Geom::Matrix const t (transform);
+ Geom::Affine const t (transform);
nr_arena_item_set_transform (item, &t);
}
void
-nr_arena_item_set_transform (NRArenaItem *item, Geom::Matrix const *transform)
+nr_arena_item_set_transform (NRArenaItem *item, Geom::Affine const *transform)
{
nr_return_if_fail (item != NULL);
nr_return_if_fail (NR_IS_ARENA_ITEM (item));
@@ -649,8 +648,8 @@ nr_arena_item_set_transform (NRArenaItem *item, Geom::Matrix const *transform)
if (!transform && !item->transform)
return;
- const Geom::Matrix *md = (item->transform) ? item->transform : &GEOM_MATRIX_IDENTITY;
- const Geom::Matrix *ms = (transform) ? transform : &GEOM_MATRIX_IDENTITY;
+ const Geom::Affine *md = (item->transform) ? item->transform : &GEOM_MATRIX_IDENTITY;
+ const Geom::Affine *ms = (transform) ? transform : &GEOM_MATRIX_IDENTITY;
if (!Geom::matrix_equalp(*md, *ms, NR_EPSILON)) {
nr_arena_item_request_render (item);
@@ -659,7 +658,7 @@ nr_arena_item_set_transform (NRArenaItem *item, Geom::Matrix const *transform)
item->transform = NULL;
} else {
if (!item->transform)
- item->transform = new (GC::ATOMIC) Geom::Matrix ();
+ item->transform = new (GC::ATOMIC) Geom::Affine ();
*item->transform = *transform;
}
nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, TRUE);
diff --git a/src/display/nr-arena-item.h b/src/display/nr-arena-item.h
index 1497987ba..0fc4cbe48 100644
--- a/src/display/nr-arena-item.h
+++ b/src/display/nr-arena-item.h
@@ -14,7 +14,7 @@
#define SEEN_DISPLAY_NR_ARENA_ITEM_H
#include <cairo.h>
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include "libnr/nr-rect-l.h"
#include "libnr/nr-object.h"
#include "gc-soft-ptr.h"
@@ -67,7 +67,7 @@ class Filter;
struct NRGC {
NRGC(NRGC const *p) : parent(p) {}
NRGC const *parent;
- Geom::Matrix transform;
+ Geom::Affine transform;
};
struct NRArenaItem : public NRObject {
@@ -93,8 +93,8 @@ struct NRArenaItem : public NRObject {
NRRectL bbox; ///< Bounding box in pixel grid coordinates; (0,0) is at page origin
NRRectL drawbox; ///< Bounding box enlarged by filters, shrinked by clips and masks
Geom::OptRect item_bbox; ///< Bounding box in item coordinates, required by filters
- Geom::Matrix *transform; ///< Incremental transform of this item, as given by the transform= attribute
- Geom::Matrix ctm; ///< Total transform from pixel grid to item coords
+ Geom::Affine *transform; ///< Incremental transform of this item, as given by the transform= attribute
+ Geom::Affine ctm; ///< Total transform from pixel grid to item coords
NRArenaItem *clip; ///< Clipping path
NRArenaItem *mask; ///< Mask
Inkscape::Filters::Filter *filter; ///< Filter
@@ -161,8 +161,8 @@ NRArenaItem *nr_arena_item_unparent (NRArenaItem *item);
void nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child);
-void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const &transform);
-void nr_arena_item_set_transform(NRArenaItem *item, Geom::Matrix const *transform);
+void nr_arena_item_set_transform(NRArenaItem *item, Geom::Affine const &transform);
+void nr_arena_item_set_transform(NRArenaItem *item, Geom::Affine const *transform);
void nr_arena_item_set_opacity (NRArenaItem *item, double opacity);
void nr_arena_item_set_sensitive (NRArenaItem *item, unsigned int sensitive);
void nr_arena_item_set_visible (NRArenaItem *item, unsigned int visible);
diff --git a/src/display/nr-arena-shape.cpp b/src/display/nr-arena-shape.cpp
index c687d3ca5..227b49526 100644
--- a/src/display/nr-arena-shape.cpp
+++ b/src/display/nr-arena-shape.cpp
@@ -1,5 +1,3 @@
-#define __NR_ARENA_SHAPE_C__
-
/*
* RGBA display list system for inkscape
*
@@ -13,8 +11,8 @@
*/
#include <cairo.h>
-#include <fenv.h>
#include <glib.h>
+#include <fenv.h>
#include <typeinfo>
#include <2geom/curves.h>
@@ -348,7 +346,6 @@ nr_arena_shape_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock
}
bool outline = (NR_ARENA_ITEM(shape)->arena->rendermode == Inkscape::RENDERMODE_OUTLINE);
- //bool print_colors_preview = (NR_ARENA_ITEM(shape)->arena->rendermode == Inkscape::RENDERMODE_PRINT_COLORS_PREVIEW);
if (outline) { // cairo outline rendering
diff --git a/src/display/nr-arena.cpp b/src/display/nr-arena.cpp
index 1f7bd2591..43edb6918 100644
--- a/src/display/nr-arena.cpp
+++ b/src/display/nr-arena.cpp
@@ -57,6 +57,7 @@ nr_arena_init (NRArena *arena)
arena->delta = 0; // to be set by desktop from prefs
arena->renderoffscreen = false; // use render values from preferences otherwise render exact
arena->rendermode = Inkscape::RENDERMODE_NORMAL; // default is normal render
+ arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL; // default is normal color
arena->blurquality = BLUR_QUALITY_NORMAL;
arena->filterquality = Inkscape::Filters::FILTER_QUALITY_NORMAL;
arena->outlinecolor = 0xff; // black; to be set by desktop from bg color
@@ -87,6 +88,7 @@ nr_arena_request_update (NRArena *arena, NRArenaItem *item)
arena->blurquality = BLUR_QUALITY_BEST;
arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
arena->rendermode = Inkscape::RENDERMODE_NORMAL;
+ arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL;
}
if (aobject->callbacks) {
@@ -118,6 +120,7 @@ nr_arena_request_render_rect (NRArena *arena, NRRectL *area)
arena->blurquality = BLUR_QUALITY_BEST;
arena->filterquality = Inkscape::Filters::FILTER_QUALITY_BEST;
arena->rendermode = Inkscape::RENDERMODE_NORMAL;
+ arena->colorrendermode = Inkscape::COLORRENDERMODE_NORMAL;
}
if (aobject->callbacks && area && !nr_rect_l_test_empty_ptr(area)) {
for (unsigned int i = 0; i < aobject->callbacks->length; i++) {
diff --git a/src/display/nr-arena.h b/src/display/nr-arena.h
index f4d86a2e6..4d33aaa99 100644
--- a/src/display/nr-arena.h
+++ b/src/display/nr-arena.h
@@ -48,6 +48,7 @@ struct NRArena : public NRActiveObject {
double delta;
bool renderoffscreen; // if true then rendering must be exact
Inkscape::RenderMode rendermode;
+ Inkscape::ColorRenderMode colorrendermode;
int blurquality; // will be updated during update from preferences
int filterquality; // will be updated during update from preferences
diff --git a/src/display/nr-filter-blend.cpp b/src/display/nr-filter-blend.cpp
index b5343d1d6..3cec479fa 100644
--- a/src/display/nr-filter-blend.cpp
+++ b/src/display/nr-filter-blend.cpp
@@ -190,7 +190,7 @@ void FilterBlend::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterBlend::can_handle_affine(Geom::Matrix const &)
+bool FilterBlend::can_handle_affine(Geom::Affine const &)
{
// blend is a per-pixel primitive and is immutable under transformations
return true;
diff --git a/src/display/nr-filter-blend.h b/src/display/nr-filter-blend.h
index 0a2ba64d4..64b3c9284 100644
--- a/src/display/nr-filter-blend.h
+++ b/src/display/nr-filter-blend.h
@@ -38,7 +38,7 @@ public:
virtual ~FilterBlend();
virtual void render_cairo(FilterSlot &slot);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
virtual void set_input(int slot);
virtual void set_input(int input, int slot);
diff --git a/src/display/nr-filter-colormatrix.cpp b/src/display/nr-filter-colormatrix.cpp
index 1c2e3d85a..5f308da6a 100644
--- a/src/display/nr-filter-colormatrix.cpp
+++ b/src/display/nr-filter-colormatrix.cpp
@@ -182,12 +182,12 @@ void FilterColorMatrix::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterColorMatrix::can_handle_affine(Geom::Matrix const &)
+bool FilterColorMatrix::can_handle_affine(Geom::Affine const &)
{
return true;
}
-void FilterColorMatrix::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*trans*/)
+void FilterColorMatrix::area_enlarge(NRRectL &/*area*/, Geom::Affine const &/*trans*/)
{
}
diff --git a/src/display/nr-filter-colormatrix.h b/src/display/nr-filter-colormatrix.h
index 8e9b8a990..df851e0aa 100644
--- a/src/display/nr-filter-colormatrix.h
+++ b/src/display/nr-filter-colormatrix.h
@@ -36,9 +36,9 @@ public:
virtual ~FilterColorMatrix();
virtual void render_cairo(FilterSlot &slot);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
virtual void set_type(FilterColorMatrixType type);
virtual void set_value(gdouble value);
virtual void set_values(std::vector<gdouble> const &values);
diff --git a/src/display/nr-filter-component-transfer.cpp b/src/display/nr-filter-component-transfer.cpp
index 83f240307..80bc07df8 100644
--- a/src/display/nr-filter-component-transfer.cpp
+++ b/src/display/nr-filter-component-transfer.cpp
@@ -299,12 +299,12 @@ void FilterComponentTransfer::render_cairo(FilterSlot &slot)
//cairo_surface_destroy(outtemp);
}
-bool FilterComponentTransfer::can_handle_affine(Geom::Matrix const &)
+bool FilterComponentTransfer::can_handle_affine(Geom::Affine const &)
{
return true;
}
-void FilterComponentTransfer::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*trans*/)
+void FilterComponentTransfer::area_enlarge(NRRectL &/*area*/, Geom::Affine const &/*trans*/)
{
}
diff --git a/src/display/nr-filter-component-transfer.h b/src/display/nr-filter-component-transfer.h
index b26aee917..89bc61403 100644
--- a/src/display/nr-filter-component-transfer.h
+++ b/src/display/nr-filter-component-transfer.h
@@ -36,8 +36,8 @@ public:
virtual ~FilterComponentTransfer();
virtual void render_cairo(FilterSlot &slot);
- virtual bool can_handle_affine(Geom::Matrix const &);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual bool can_handle_affine(Geom::Affine const &);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
FilterComponentTransferType type[4];
std::vector<gdouble> tableValues[4];
diff --git a/src/display/nr-filter-composite.cpp b/src/display/nr-filter-composite.cpp
index 68700f792..d4cf47af4 100644
--- a/src/display/nr-filter-composite.cpp
+++ b/src/display/nr-filter-composite.cpp
@@ -101,7 +101,7 @@ void FilterComposite::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterComposite::can_handle_affine(Geom::Matrix const &)
+bool FilterComposite::can_handle_affine(Geom::Affine const &)
{
return true;
}
diff --git a/src/display/nr-filter-composite.h b/src/display/nr-filter-composite.h
index 828eb55b3..930898830 100644
--- a/src/display/nr-filter-composite.h
+++ b/src/display/nr-filter-composite.h
@@ -27,7 +27,7 @@ public:
virtual ~FilterComposite();
virtual void render_cairo(FilterSlot &);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
virtual void set_input(int input);
virtual void set_input(int input, int slot);
diff --git a/src/display/nr-filter-convolve-matrix.cpp b/src/display/nr-filter-convolve-matrix.cpp
index 0a5ba16b0..06e28b074 100644
--- a/src/display/nr-filter-convolve-matrix.cpp
+++ b/src/display/nr-filter-convolve-matrix.cpp
@@ -202,7 +202,7 @@ void FilterConvolveMatrix::set_preserveAlpha(bool pa){
preserveAlpha = pa;
}
-void FilterConvolveMatrix::area_enlarge(NRRectL &area, Geom::Matrix const &/*trans*/)
+void FilterConvolveMatrix::area_enlarge(NRRectL &area, Geom::Affine const &/*trans*/)
{
//Seems to me that since this filter's operation is resolution dependent,
// some spurious pixels may still appear at the borders when low zooming or rotating. Needs a better fix.
diff --git a/src/display/nr-filter-convolve-matrix.h b/src/display/nr-filter-convolve-matrix.h
index 4f314e4c3..d13738260 100644
--- a/src/display/nr-filter-convolve-matrix.h
+++ b/src/display/nr-filter-convolve-matrix.h
@@ -35,7 +35,7 @@ public:
virtual ~FilterConvolveMatrix();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
void set_targetY(int coord);
void set_targetX(int coord);
diff --git a/src/display/nr-filter-diffuselighting.cpp b/src/display/nr-filter-diffuselighting.cpp
index cc14bb165..e2954c3b1 100644
--- a/src/display/nr-filter-diffuselighting.cpp
+++ b/src/display/nr-filter-diffuselighting.cpp
@@ -83,7 +83,7 @@ private:
struct DiffusePointLight : public DiffuseLight {
DiffusePointLight(cairo_surface_t *bumpmap, SPFePointLight *light, guint32 color,
- Geom::Matrix const &trans, double scale, double diffuse_constant, double x0, double y0)
+ Geom::Affine const &trans, double scale, double diffuse_constant, double x0, double y0)
: DiffuseLight(bumpmap, scale, diffuse_constant)
, _light(light, color, trans)
, _x0(x0)
@@ -105,7 +105,7 @@ private:
struct DiffuseSpotLight : public DiffuseLight {
DiffuseSpotLight(cairo_surface_t *bumpmap, SPFeSpotLight *light, guint32 color,
- Geom::Matrix const &trans, double scale, double diffuse_constant, double x0, double y0)
+ Geom::Affine const &trans, double scale, double diffuse_constant, double x0, double y0)
: DiffuseLight(bumpmap, scale, diffuse_constant)
, _light(light, color, trans)
, _x0(x0)
@@ -129,7 +129,7 @@ void FilterDiffuseLighting::render_cairo(FilterSlot &slot)
cairo_surface_t *out = ink_cairo_surface_create_same_size(input, CAIRO_CONTENT_COLOR_ALPHA);
NRRectL const &slot_area = slot.get_slot_area();
- Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine trans = slot.get_units().get_matrix_primitiveunits2pb();
double x0 = slot_area.x0, y0 = slot_area.y0;
double scale = surfaceScale * trans.descrim();
@@ -159,7 +159,7 @@ void FilterDiffuseLighting::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-void FilterDiffuseLighting::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterDiffuseLighting::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
// TODO: support kernelUnitLength
diff --git a/src/display/nr-filter-diffuselighting.h b/src/display/nr-filter-diffuselighting.h
index 1c17e8fe8..100673749 100644
--- a/src/display/nr-filter-diffuselighting.h
+++ b/src/display/nr-filter-diffuselighting.h
@@ -32,7 +32,7 @@ public:
static FilterPrimitive *create();
virtual ~FilterDiffuseLighting();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
union {
SPFeDistantLight *distant;
diff --git a/src/display/nr-filter-displacement-map.cpp b/src/display/nr-filter-displacement-map.cpp
index 74b1b1dab..fdaf2c887 100644
--- a/src/display/nr-filter-displacement-map.cpp
+++ b/src/display/nr-filter-displacement-map.cpp
@@ -196,7 +196,7 @@ void FilterDisplacementMap::render_cairo(FilterSlot &slot)
cairo_surface_t *map = slot.getcairo(_input2);
cairo_surface_t *out = ink_cairo_surface_create_identical(texture);
- Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine trans = slot.get_units().get_matrix_primitiveunits2pb();
double scalex = scale * trans.expansionX();
double scaley = scale * trans.expansionY();
@@ -249,7 +249,7 @@ int FilterDisplacementMap::render(FilterSlot &slot, FilterUnits const &units) {
bool map_premultiplied = (map->mode == NR_PIXBLOCK_MODE_R8G8B8A8P);
bool data_premultiplied = (out->mode == NR_PIXBLOCK_MODE_R8G8B8A8P);
- Geom::Matrix trans = units.get_matrix_primitiveunits2pb();
+ Geom::Affine trans = units.get_matrix_primitiveunits2pb();
double scalex = scale * trans.expansionX();
double scaley = scale * trans.expansionY();
@@ -314,7 +314,7 @@ void FilterDisplacementMap::set_channel_selector(int s, FilterDisplacementMapCha
if (s == 1) Ychannel = ch;
}
-void FilterDisplacementMap::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterDisplacementMap::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
//I assume scale is in user coordinates (?!?)
//FIXME: trans should be multiplied by some primitiveunits2user, shouldn't it?
diff --git a/src/display/nr-filter-displacement-map.h b/src/display/nr-filter-displacement-map.h
index 534fac620..aec4b7eb6 100644
--- a/src/display/nr-filter-displacement-map.h
+++ b/src/display/nr-filter-displacement-map.h
@@ -32,7 +32,7 @@ public:
virtual void set_scale(double s);
virtual void set_channel_selector(int s, FilterDisplacementMapChannelSelector channel);
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
private:
double scale;
diff --git a/src/display/nr-filter-flood.cpp b/src/display/nr-filter-flood.cpp
index 4e3952f9a..a015d3f1f 100644
--- a/src/display/nr-filter-flood.cpp
+++ b/src/display/nr-filter-flood.cpp
@@ -3,8 +3,9 @@
*
* Authors:
* Felipe CorrĂȘa da Silva Sanches <juca@members.fsf.org>
+ * Tavmjong Bah <tavmjong@free.fr> (use primitive filter region)
*
- * Copyright (C) 2007 authors
+ * Copyright (C) 2007, 2011 authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -63,7 +64,7 @@ void FilterFlood::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterFlood::can_handle_affine(Geom::Matrix const &)
+bool FilterFlood::can_handle_affine(Geom::Affine const &)
{
// flood is a per-pixel primitive and is immutable under transformations
return true;
@@ -81,7 +82,7 @@ void FilterFlood::set_icc(SVGICCColor *icc_color) {
icc = icc_color;
}
-void FilterFlood::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*trans*/)
+void FilterFlood::area_enlarge(NRRectL &/*area*/, Geom::Affine const &/*trans*/)
{
}
diff --git a/src/display/nr-filter-flood.h b/src/display/nr-filter-flood.h
index 78b48302f..6db90d439 100644
--- a/src/display/nr-filter-flood.h
+++ b/src/display/nr-filter-flood.h
@@ -26,11 +26,11 @@ public:
virtual ~FilterFlood();
virtual void render_cairo(FilterSlot &slot);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
virtual void set_opacity(double o);
virtual void set_color(guint32 c);
virtual void set_icc(SVGICCColor *icc_color);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
private:
double opacity;
guint32 color;
diff --git a/src/display/nr-filter-gaussian.cpp b/src/display/nr-filter-gaussian.cpp
index 9bd9723cd..fdffabfeb 100644
--- a/src/display/nr-filter-gaussian.cpp
+++ b/src/display/nr-filter-gaussian.cpp
@@ -33,7 +33,7 @@
#include "display/nr-filter-types.h"
#include "display/nr-filter-units.h"
#include "display/nr-filter-slot.h"
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include "util/fixed_point.h"
#include "preferences.h"
@@ -78,15 +78,46 @@ template<typename T> static inline T clip(T const& v, T const& a, T const& b) {
}
template<typename Tt, typename Ts>
-static inline Tt round_cast(Ts const& v) {
+static inline Tt round_cast(Ts v) {
static Ts const rndoffset(.5);
return static_cast<Tt>(v+rndoffset);
}
+template<>
+inline unsigned char round_cast(double v) {
+ // This (fast) rounding method is based on:
+ // http://stereopsis.com/sree/fpu2006.html
+#if G_BYTE_ORDER==G_LITTLE_ENDIAN
+ double const dmr = 6755399441055744.0;
+ v = v + dmr;
+ return ((unsigned char*)&v)[0];
+#elif G_BYTE_ORDER==G_BIG_ENDIAN
+ double const dmr = 6755399441055744.0;
+ v = v + dmr;
+ return ((unsigned char*)&v)[7];
+#else
+ static double const rndoffset(.5);
+ return static_cast<unsigned char>(v+rndoffset);
+#endif
+}
+
+template<typename Tt, typename Ts>
+static inline Tt clip_round_cast(Ts const v) {
+ Ts const minval = std::numeric_limits<Tt>::min();
+ Ts const maxval = std::numeric_limits<Tt>::max();
+ Tt const minval_rounded = std::numeric_limits<Tt>::min();
+ Ts const maxval_rounded = std::numeric_limits<Tt>::max();
+ if ( v < minval ) return minval_rounded;
+ if ( v > maxval ) return maxval_rounded;
+ return round_cast<Tt>(v);
+}
+
template<typename Tt, typename Ts>
-static inline Tt clip_round_cast(Ts const& v, Tt const minval=std::numeric_limits<Tt>::min(), Tt const maxval=std::numeric_limits<Tt>::max()) {
- if ( v < minval ) return minval;
- if ( v > maxval ) return maxval;
+static inline Tt clip_round_cast_varmax(Ts const v, Ts const maxval, Tt const maxval_rounded) {
+ Ts const minval = std::numeric_limits<Tt>::min();
+ Tt const minval_rounded = std::numeric_limits<Tt>::min();
+ if ( v < minval ) return minval_rounded;
+ if ( v > maxval ) return maxval_rounded;
return round_cast<Tt>(v);
}
@@ -313,7 +344,7 @@ filter2D_IIR(PT *const dest, int const dstr1, int const dstr2,
dstimg -= dstr1;
if ( PREMULTIPLIED_ALPHA ) {
dstimg[alpha_PC] = clip_round_cast<PT>(v[0][alpha_PC]);
- PREMUL_ALPHA_LOOP dstimg[c] = clip_round_cast<PT>(v[0][c], std::numeric_limits<PT>::min(), dstimg[alpha_PC]);
+ PREMUL_ALPHA_LOOP dstimg[c] = clip_round_cast_varmax<PT>(v[0][c], v[0][alpha_PC], dstimg[alpha_PC]);
} else {
for(unsigned int c=0; c<PC; c++) dstimg[c] = clip_round_cast<PT>(v[0][c]);
}
@@ -328,7 +359,7 @@ filter2D_IIR(PT *const dest, int const dstr1, int const dstr2,
dstimg -= dstr1;
if ( PREMULTIPLIED_ALPHA ) {
dstimg[alpha_PC] = clip_round_cast<PT>(v[0][alpha_PC]);
- PREMUL_ALPHA_LOOP dstimg[c] = clip_round_cast<PT>(v[0][c], std::numeric_limits<PT>::min(), dstimg[alpha_PC]);
+ PREMUL_ALPHA_LOOP dstimg[c] = clip_round_cast_varmax<PT>(v[0][c], v[0][alpha_PC], dstimg[alpha_PC]);
} else {
for(unsigned int c=0; c<PC; c++) dstimg[c] = clip_round_cast<PT>(v[0][c]);
}
@@ -534,7 +565,7 @@ void FilterGaussian::render_cairo(FilterSlot &slot)
return;
}
- Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine trans = slot.get_units().get_matrix_primitiveunits2pb();
int w_orig = ink_cairo_surface_get_width(in);
int h_orig = ink_cairo_surface_get_height(in);
@@ -635,7 +666,7 @@ void FilterGaussian::render_cairo(FilterSlot &slot)
}
}
-void FilterGaussian::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterGaussian::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
int area_x = _effect_area_scr(_deviation_x * trans.expansionX());
int area_y = _effect_area_scr(_deviation_y * trans.expansionY());
@@ -648,7 +679,7 @@ void FilterGaussian::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
area.y1 += area_max;
}
-bool FilterGaussian::can_handle_affine(Geom::Matrix const &)
+bool FilterGaussian::can_handle_affine(Geom::Affine const &)
{
// Previously we tried to be smart and return true for rotations.
// However, the transform passed here is NOT the total transform
diff --git a/src/display/nr-filter-gaussian.h b/src/display/nr-filter-gaussian.h
index cf3881ee3..811502016 100644
--- a/src/display/nr-filter-gaussian.h
+++ b/src/display/nr-filter-gaussian.h
@@ -35,8 +35,8 @@ public:
virtual ~FilterGaussian();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &m);
- virtual bool can_handle_affine(Geom::Matrix const &m);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &m);
+ virtual bool can_handle_affine(Geom::Affine const &m);
/**
* Set the standard deviation value for gaussian blur. Deviation along
diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
index ca361e007..eea4f9781 100644
--- a/src/display/nr-filter-image.cpp
+++ b/src/display/nr-filter-image.cpp
@@ -6,7 +6,7 @@
* Tavmjong Bah <tavmjong@free.fr>
* Abhishek Sharma
*
- * Copyright (C) 2007 authors
+ * Copyright (C) 2007-2011 authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -48,7 +48,7 @@ void FilterImage::render_cairo(FilterSlot &slot)
//cairo_surface_t *input = slot.getcairo(_input);
- Geom::Matrix m = slot.get_units().get_matrix_user2filterunits().inverse();
+ Geom::Affine m = slot.get_units().get_matrix_user2filterunits().inverse();
Geom::Point bbox_00 = Geom::Point(0,0) * m;
Geom::Point bbox_w0 = Geom::Point(1,0) * m;
Geom::Point bbox_0h = Geom::Point(0,1) * m;
@@ -86,7 +86,7 @@ void FilterImage::render_cairo(FilterSlot &slot)
}
Geom::Rect area = *optarea;
- Geom::Matrix pu2pb = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine pu2pb = slot.get_units().get_matrix_primitiveunits2pb();
double scaleX = feImageWidth / area.width();
double scaleY = feImageHeight / area.height();
@@ -109,7 +109,7 @@ void FilterImage::render_cairo(FilterSlot &slot)
// Update to renderable state
NRGC gc(NULL);
- Geom::Matrix t = Geom::identity();
+ Geom::Affine t = Geom::identity();
nr_arena_item_set_transform(ai, &t);
gc.transform.setIdentity();
nr_arena_item_invoke_update(ai, NULL, &gc,
@@ -189,6 +189,8 @@ void FilterImage::render_cairo(FilterSlot &slot)
ink_cairo_transform(ct, slot.get_units().get_matrix_primitiveunits2pb());
// now ct is in the coordinates of feImageX etc.
+ // TODO: add preserveAspectRatio support here
+
double scaleX = feImageWidth / image->get_width();
double scaleY = feImageHeight / image->get_height();
@@ -201,7 +203,7 @@ void FilterImage::render_cairo(FilterSlot &slot)
slot.set(_output, out);
}
-bool FilterImage::can_handle_affine(Geom::Matrix const &)
+bool FilterImage::can_handle_affine(Geom::Affine const &)
{
return true;
}
@@ -221,13 +223,21 @@ void FilterImage::set_document(SPDocument *doc){
document = doc;
}
-void FilterImage::set_region(SVGLength x, SVGLength y, SVGLength width, SVGLength height){
+void FilterImage::set_region(SVGLength x, SVGLength y, SVGLength width, SVGLength height) {
feImageX=x.computed;
feImageY=y.computed;
feImageWidth=width.computed;
feImageHeight=height.computed;
}
+void FilterImage::set_align( unsigned int align ) {
+ aspect_align = align;
+}
+
+void FilterImage::set_clip( unsigned int clip ) {
+ aspect_clip = clip;
+}
+
} /* namespace Filters */
} /* namespace Inkscape */
diff --git a/src/display/nr-filter-image.h b/src/display/nr-filter-image.h
index bd5cd525c..0651109ec 100644
--- a/src/display/nr-filter-image.h
+++ b/src/display/nr-filter-image.h
@@ -28,10 +28,12 @@ public:
virtual ~FilterImage();
virtual void render_cairo(FilterSlot &slot);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
void set_document( SPDocument *document );
void set_href(const gchar *href);
void set_region(SVGLength x, SVGLength y, SVGLength width, SVGLength height);
+ void set_align( unsigned int align );
+ void set_clip( unsigned int clip );
bool from_element;
SPItem* SVGElem;
@@ -40,7 +42,8 @@ private:
gchar *feImageHref;
Glib::RefPtr<Gdk::Pixbuf> image;
cairo_surface_t *image_surface;
- float feImageX,feImageY,feImageWidth,feImageHeight;
+ float feImageX, feImageY, feImageWidth, feImageHeight;
+ unsigned int aspect_align, aspect_clip;
bool broken_ref;
};
diff --git a/src/display/nr-filter-merge.cpp b/src/display/nr-filter-merge.cpp
index 2129d7894..51d3975cb 100644
--- a/src/display/nr-filter-merge.cpp
+++ b/src/display/nr-filter-merge.cpp
@@ -61,7 +61,7 @@ void FilterMerge::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterMerge::can_handle_affine(Geom::Matrix const &)
+bool FilterMerge::can_handle_affine(Geom::Affine const &)
{
// Merge is a per-pixel primitive and is immutable under transformations
return true;
diff --git a/src/display/nr-filter-merge.h b/src/display/nr-filter-merge.h
index 9c4204f07..263fc8026 100644
--- a/src/display/nr-filter-merge.h
+++ b/src/display/nr-filter-merge.h
@@ -25,7 +25,7 @@ public:
virtual ~FilterMerge();
virtual void render_cairo(FilterSlot &);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual bool can_handle_affine(Geom::Affine const &);
virtual void set_input(int input);
virtual void set_input(int input, int slot);
diff --git a/src/display/nr-filter-morphology.cpp b/src/display/nr-filter-morphology.cpp
index 9d3682fd6..c79667d3e 100644
--- a/src/display/nr-filter-morphology.cpp
+++ b/src/display/nr-filter-morphology.cpp
@@ -121,7 +121,7 @@ void FilterMorphology::render_cairo(FilterSlot &slot)
return;
}
- Geom::Matrix p2pb = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine p2pb = slot.get_units().get_matrix_primitiveunits2pb();
double xr = xradius * p2pb.expansionX();
double yr = yradius * p2pb.expansionY();
@@ -147,7 +147,7 @@ void FilterMorphology::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-void FilterMorphology::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterMorphology::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
int enlarge_x = ceil(xradius * trans.expansionX());
int enlarge_y = ceil(yradius * trans.expansionY());
diff --git a/src/display/nr-filter-morphology.h b/src/display/nr-filter-morphology.h
index 48f43d61f..5924085d9 100644
--- a/src/display/nr-filter-morphology.h
+++ b/src/display/nr-filter-morphology.h
@@ -32,7 +32,7 @@ public:
virtual ~FilterMorphology();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
void set_operator(FilterMorphologyOperator &o);
void set_xradius(double x);
void set_yradius(double y);
diff --git a/src/display/nr-filter-offset.cpp b/src/display/nr-filter-offset.cpp
index 7b70398db..3b0f83841 100644
--- a/src/display/nr-filter-offset.cpp
+++ b/src/display/nr-filter-offset.cpp
@@ -38,7 +38,7 @@ void FilterOffset::render_cairo(FilterSlot &slot)
cairo_surface_t *out = ink_cairo_surface_create_identical(in);
cairo_t *ct = cairo_create(out);
- Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine trans = slot.get_units().get_matrix_primitiveunits2pb();
Geom::Point offset(dx, dy);
offset *= trans;
offset[X] -= trans[4];
@@ -52,7 +52,7 @@ void FilterOffset::render_cairo(FilterSlot &slot)
cairo_surface_destroy(out);
}
-bool FilterOffset::can_handle_affine(Geom::Matrix const &)
+bool FilterOffset::can_handle_affine(Geom::Affine const &)
{
return true;
}
@@ -65,7 +65,7 @@ void FilterOffset::set_dy(double amount) {
dy = amount;
}
-void FilterOffset::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterOffset::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
Geom::Point offset(dx, dy);
offset *= trans;
diff --git a/src/display/nr-filter-offset.h b/src/display/nr-filter-offset.h
index 4a9e96789..09c57f803 100644
--- a/src/display/nr-filter-offset.h
+++ b/src/display/nr-filter-offset.h
@@ -27,8 +27,8 @@ public:
virtual ~FilterOffset();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
- virtual bool can_handle_affine(Geom::Matrix const &);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
+ virtual bool can_handle_affine(Geom::Affine const &);
void set_dx(double amount);
void set_dy(double amount);
diff --git a/src/display/nr-filter-primitive.cpp b/src/display/nr-filter-primitive.cpp
index 2926b4960..b544d6df0 100644
--- a/src/display/nr-filter-primitive.cpp
+++ b/src/display/nr-filter-primitive.cpp
@@ -5,6 +5,7 @@
*
* Author:
* Niko Kiirala <niko@kiirala.com>
+ * Tavmjong Bah <tavmjong@free.fr> (primitive subregion)
*
* Copyright (C) 2006 Niko Kiirala
*
@@ -19,17 +20,27 @@
namespace Inkscape {
namespace Filters {
+using Geom::X;
+using Geom::Y;
+
FilterPrimitive::FilterPrimitive()
{
_input = NR_FILTER_SLOT_NOT_SET;
_output = NR_FILTER_SLOT_NOT_SET;
- // These defaults are according to SVG standard.
+ // Primitive subregion, should default to the union of all subregions of referenced nodes
+ // (i.e. other filter primitives except feTile). If no referenced nodes, defaults to filter
+ // region expressed in percent. At the moment, we do not check referenced nodes.
+
+ // We must keep track if a value is set or not, if not set then the region defaults to 0%, 0%,
+ // 100%, 100% ("x", "y", "width", "height") of the -> filter <- region. If set, then
+ // percentages are in terms of bounding box or viewbox, depending on value of "primitiveUnits".
+
// NB: SVGLength.set takes prescaled percent values: 1 means 100%
- _region_x.set(SVGLength::PERCENT, 0, 0);
- _region_y.set(SVGLength::PERCENT, 0, 0);
- _region_width.set(SVGLength::PERCENT, 1, 0);
- _region_height.set(SVGLength::PERCENT, 1, 0);
+ _subregion_x.unset(SVGLength::PERCENT, 0, 0);
+ _subregion_y.unset(SVGLength::PERCENT, 0, 0);
+ _subregion_width.unset(SVGLength::PERCENT, 1, 0);
+ _subregion_height.unset(SVGLength::PERCENT, 1, 0);
}
FilterPrimitive::~FilterPrimitive()
@@ -44,7 +55,7 @@ void FilterPrimitive::render_cairo(FilterSlot &slot)
slot.set(_output, in);
}
-void FilterPrimitive::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*m*/)
+void FilterPrimitive::area_enlarge(NRRectL &/*area*/, Geom::Affine const &/*m*/)
{
// This doesn't need to do anything by default
}
@@ -61,6 +72,97 @@ void FilterPrimitive::set_output(int slot) {
if (slot >= 0) _output = slot;
}
+// We need to copy reference even if unset as we need to know if
+// someone has unset a value.
+void FilterPrimitive::set_x(SVGLength const &length)
+{
+ _subregion_x = length;
+}
+
+void FilterPrimitive::set_y(SVGLength const &length)
+{
+ _subregion_y = length;
+}
+void FilterPrimitive::set_width(SVGLength const &length)
+{
+ _subregion_width = length;
+}
+void FilterPrimitive::set_height(SVGLength const &length)
+{
+ _subregion_height = length;
+}
+
+void FilterPrimitive::set_subregion(SVGLength const &x, SVGLength const &y,
+ SVGLength const &width, SVGLength const &height) {
+ _subregion_x = x;
+ _subregion_y = y;
+ _subregion_width = width;
+ _subregion_height = height;
+}
+
+Geom::Rect FilterPrimitive::filter_primitive_area(FilterUnits const &units)
+{
+ Geom::OptRect bb = units.get_item_bbox();
+ Geom::OptRect fa = units.get_filter_area();
+
+ /* Update computed values for ex, em, %. For %, assumes primitive unit is objectBoundingBox. */
+ /* TODO: fetch somehow the object ex and em lengths; 12, 6 are just dummy values. */
+ double len_x = bb->width();
+ double len_y = bb->height();
+ _subregion_x.update(12, 6, len_x);
+ _subregion_y.update(12, 6, len_y);
+ _subregion_width.update(12, 6, len_x);
+ _subregion_height.update(12, 6, len_y);
+
+ // x, y, width, and height are independently defined (i.e. one can be defined, by default, to
+ // the filter area while another is defined relative to the bounding box). It is better to keep
+ // track of them separately and then compose the Rect at the end.
+ double x = 0;
+ double y = 0;
+ double width = 0;
+ double height = 0;
+
+ // If subregion not set, by special case use filter region.
+ if( !_subregion_x._set ) x = fa->min()[X];
+ if( !_subregion_y._set ) y = fa->min()[Y];
+ if( !_subregion_width._set ) width = fa->width();
+ if( !_subregion_height._set ) height = fa->height();
+
+ if( units.get_primitive_units() == SP_FILTER_UNITS_OBJECTBOUNDINGBOX ) {
+ // Values are in terms of fraction of bounding box.
+ if( _subregion_x._set && _subregion_x.unit != SVGLength::PERCENT ) x = bb->min()[X] + bb->width() * _subregion_x.value;
+ if( _subregion_y._set && _subregion_y.unit != SVGLength::PERCENT ) y = bb->min()[Y] + bb->height() * _subregion_y.value;
+ if( _subregion_width._set && _subregion_width.unit != SVGLength::PERCENT ) width = bb->width() * _subregion_width.value;
+ if( _subregion_height._set && _subregion_height.unit != SVGLength::PERCENT ) height = bb->height() * _subregion_height.value;
+ // Values are in terms of percent
+ if( _subregion_x._set && _subregion_x.unit == SVGLength::PERCENT ) x = bb->min()[X] + _subregion_x.computed;
+ if( _subregion_y._set && _subregion_y.unit == SVGLength::PERCENT ) y = bb->min()[Y] + _subregion_y.computed;
+ if( _subregion_width._set && _subregion_width.unit == SVGLength::PERCENT ) width = _subregion_width.computed;
+ if( _subregion_height._set && _subregion_height.unit == SVGLength::PERCENT ) height = _subregion_height.computed;
+ } else {
+ // Values are in terms of user space coordinates or percent of viewbox (yuck!),
+ // which is usually the size of SVG drawing. Default.
+ if( _subregion_x._set && _subregion_x.unit != SVGLength::PERCENT ) x = _subregion_x.computed;
+ if( _subregion_y._set && _subregion_y.unit != SVGLength::PERCENT ) y = _subregion_y.computed;
+ if( _subregion_width._set && _subregion_width.unit != SVGLength::PERCENT ) width = _subregion_width.computed;
+ if( _subregion_height._set && _subregion_height.unit != SVGLength::PERCENT ) height = _subregion_height.computed;
+ // TODO: add percent of viewport TEMPORARY HACK FOR TESTING...
+ if( _subregion_x._set && _subregion_x.unit == SVGLength::PERCENT ) x = _subregion_x.value * 480; // viewport_x
+ if( _subregion_y._set && _subregion_y.unit == SVGLength::PERCENT ) y = _subregion_y.value * 360;
+ if( _subregion_width._set && _subregion_width.unit == SVGLength::PERCENT ) width = _subregion_width.value * 480;
+ if( _subregion_height._set && _subregion_height.unit == SVGLength::PERCENT ) height = _subregion_height.value * 360;
+ }
+
+ Geom::Point minp, maxp;
+ minp[X] = x;
+ minp[Y] = y;
+ maxp[X] = x + width;
+ maxp[Y] = y + height;
+
+ Geom::Rect area(minp, maxp);
+ return area;
+}
+
FilterTraits FilterPrimitive::get_input_traits() {
return TRAIT_ANYTHING;
}
diff --git a/src/display/nr-filter-primitive.h b/src/display/nr-filter-primitive.h
index 06badffa6..dd7363d76 100644
--- a/src/display/nr-filter-primitive.h
+++ b/src/display/nr-filter-primitive.h
@@ -47,7 +47,7 @@ public:
virtual void render_cairo(FilterSlot &slot);
virtual int render(FilterSlot &slot, FilterUnits const &units) { return 0; }
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &m);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &m);
/**
* Sets the input slot number 'slot' to be used as input in rendering
@@ -81,27 +81,27 @@ public:
*/
virtual void set_output(int slot);
- void set_x(SVGLength &length);
- void set_y(SVGLength &length);
- void set_width(SVGLength &length);
- void set_height(SVGLength &length);
-
/**
* Sets the filter primitive subregion. Passing an unset length
- * (length._set == false) as any parameter results in that parameter
- * not being changed.
- * Filter primitive will not hold any references to the passed
- * SVGLength object after function returns.
- * If any of the parameters does not get set the default value, as
- * defined in SVG standard, for that parameter is used instead.
+ * (length._set == false) WILL change the parameter as it is
+ * important to know if a parameter is unset.
*/
- void set_region(SVGLength &x, SVGLength &y,
- SVGLength &width, SVGLength &height);
+ void set_x(SVGLength const &length);
+ void set_y(SVGLength const &length);
+ void set_width(SVGLength const &length);
+ void set_height(SVGLength const &length);
+ void set_subregion(SVGLength const &x, SVGLength const &y,
+ SVGLength const &width, SVGLength const &height);
/**
* Resets the filter primitive subregion to its default value
*/
- void reset_region();
+ void reset_subregion(); // Not implemented
+
+ /**
+ * Returns the filter primitive area in user coordinate system.
+ */
+ Geom::Rect filter_primitive_area(FilterUnits const &units);
/**
* Queries the filter, which traits it needs from its input buffers.
@@ -123,16 +123,17 @@ public:
* the matrices from FilterUnits will contain at most a (possibly non-uniform) scale
* and a translation. When all primitives of the filter return false, the rendering is
* performed in display coordinate space and no intermediate surface is used. */
- virtual bool can_handle_affine(Geom::Matrix const &) { return false; }
+ virtual bool can_handle_affine(Geom::Affine const &) { return false; }
protected:
int _input;
int _output;
- SVGLength _region_x;
- SVGLength _region_y;
- SVGLength _region_width;
- SVGLength _region_height;
+ /* Filter primitive subregion */
+ SVGLength _subregion_x;
+ SVGLength _subregion_y;
+ SVGLength _subregion_width;
+ SVGLength _subregion_height;
};
diff --git a/src/display/nr-filter-slot.cpp b/src/display/nr-filter-slot.cpp
index dafab20c8..63f9dc1a6 100644
--- a/src/display/nr-filter-slot.cpp
+++ b/src/display/nr-filter-slot.cpp
@@ -45,7 +45,7 @@ FilterSlot::FilterSlot(NRArenaItem *item, cairo_t *bgct, NRRectL const *bgarea,
Geom::Point(_source_graphic_area->x0, _source_graphic_area->y0),
Geom::Point(_source_graphic_area->x1, _source_graphic_area->y1));
- Geom::Matrix trans = _units.get_matrix_display2pb();
+ Geom::Affine trans = _units.get_matrix_display2pb();
Geom::Rect bbox_trans = bbox * trans;
Geom::Point min = bbox_trans.min();
@@ -125,7 +125,7 @@ cairo_surface_t *FilterSlot::getcairo(int slot_nr)
cairo_surface_t *FilterSlot::_get_transformed_source_graphic()
{
- Geom::Matrix trans = _units.get_matrix_display2pb();
+ Geom::Affine trans = _units.get_matrix_display2pb();
if (trans.isIdentity()) {
cairo_surface_reference(_source_graphic);
@@ -150,7 +150,7 @@ cairo_surface_t *FilterSlot::_get_transformed_source_graphic()
cairo_surface_t *FilterSlot::_get_transformed_background()
{
- Geom::Matrix trans = _units.get_matrix_display2pb();
+ Geom::Affine trans = _units.get_matrix_display2pb();
cairo_surface_t *bg = cairo_get_target(_background_ct);
cairo_surface_t *tbg = cairo_surface_create_similar(
@@ -171,7 +171,7 @@ cairo_surface_t *FilterSlot::_get_transformed_background()
cairo_surface_t *FilterSlot::get_result(int res)
{
- Geom::Matrix trans = _units.get_matrix_pb2display();
+ Geom::Affine trans = _units.get_matrix_pb2display();
if (trans.isIdentity()) {
cairo_surface_t *result = getcairo(res);
cairo_surface_reference(result);
diff --git a/src/display/nr-filter-specularlighting.cpp b/src/display/nr-filter-specularlighting.cpp
index 97936d86a..e9e3f2b28 100644
--- a/src/display/nr-filter-specularlighting.cpp
+++ b/src/display/nr-filter-specularlighting.cpp
@@ -91,7 +91,7 @@ private:
struct SpecularPointLight : public SpecularLight {
SpecularPointLight(cairo_surface_t *bumpmap, SPFePointLight *light, guint32 color,
- Geom::Matrix const &trans, double scale, double specular_constant,
+ Geom::Affine const &trans, double scale, double specular_constant,
double specular_exponent, double x0, double y0)
: SpecularLight(bumpmap, scale, specular_constant, specular_exponent)
, _light(light, color, trans)
@@ -115,7 +115,7 @@ private:
struct SpecularSpotLight : public SpecularLight {
SpecularSpotLight(cairo_surface_t *bumpmap, SPFeSpotLight *light, guint32 color,
- Geom::Matrix const &trans, double scale, double specular_constant,
+ Geom::Affine const &trans, double scale, double specular_constant,
double specular_exponent, double x0, double y0)
: SpecularLight(bumpmap, scale, specular_constant, specular_exponent)
, _light(light, color, trans)
@@ -141,7 +141,7 @@ void FilterSpecularLighting::render_cairo(FilterSlot &slot)
cairo_surface_t *out = ink_cairo_surface_create_same_size(input, CAIRO_CONTENT_COLOR_ALPHA);
NRRectL const &slot_area = slot.get_slot_area();
- Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb();
+ Geom::Affine trans = slot.get_units().get_matrix_primitiveunits2pb();
double x0 = slot_area.x0, y0 = slot_area.y0;
double scale = surfaceScale * trans.descrim();
double ks = specularConstant;
@@ -195,7 +195,7 @@ int FilterSpecularLighting::render(FilterSlot &slot, FilterUnits const &units) {
int dx = 1; //TODO setup
int dy = 1; //TODO setup
//surface scale
- Geom::Matrix trans = units.get_matrix_primitiveunits2pb();
+ Geom::Affine trans = units.get_matrix_primitiveunits2pb();
gdouble ss = surfaceScale * trans[0];
gdouble ks = specularConstant; //diffuse lighting constant
NR::Fvector L, N, LC, H;
@@ -303,7 +303,7 @@ int FilterSpecularLighting::render(FilterSlot &slot, FilterUnits const &units) {
return 0;
}*/
-void FilterSpecularLighting::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+void FilterSpecularLighting::area_enlarge(NRRectL &area, Geom::Affine const &trans)
{
// TODO: support kernelUnitLength
diff --git a/src/display/nr-filter-specularlighting.h b/src/display/nr-filter-specularlighting.h
index 8d6252c69..155496a41 100644
--- a/src/display/nr-filter-specularlighting.h
+++ b/src/display/nr-filter-specularlighting.h
@@ -32,7 +32,7 @@ public:
static FilterPrimitive *create();
virtual ~FilterSpecularLighting();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
union {
SPFeDistantLight *distant;
diff --git a/src/display/nr-filter-tile.cpp b/src/display/nr-filter-tile.cpp
index 739ee2c5e..b88386638 100644
--- a/src/display/nr-filter-tile.cpp
+++ b/src/display/nr-filter-tile.cpp
@@ -41,7 +41,7 @@ void FilterTile::render_cairo(FilterSlot &slot)
slot.set(_output, in);
}
-void FilterTile::area_enlarge(NRRectL &/*area*/, Geom::Matrix const &/*trans*/)
+void FilterTile::area_enlarge(NRRectL &/*area*/, Geom::Affine const &/*trans*/)
{
}
diff --git a/src/display/nr-filter-tile.h b/src/display/nr-filter-tile.h
index e0eacddcf..5c0a3e553 100644
--- a/src/display/nr-filter-tile.h
+++ b/src/display/nr-filter-tile.h
@@ -26,7 +26,7 @@ public:
virtual ~FilterTile();
virtual void render_cairo(FilterSlot &slot);
- virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
+ virtual void area_enlarge(NRRectL &area, Geom::Affine const &trans);
};
} /* namespace Filters */
diff --git a/src/display/nr-filter-turbulence.cpp b/src/display/nr-filter-turbulence.cpp
index 7beebab68..c1a3abd45 100644
--- a/src/display/nr-filter-turbulence.cpp
+++ b/src/display/nr-filter-turbulence.cpp
@@ -346,7 +346,7 @@ void FilterTurbulence::set_updated(bool u){
}
struct Turbulence {
- Turbulence(TurbulenceGenerator const &gen, Geom::Matrix const &trans, int x0, int y0)
+ Turbulence(TurbulenceGenerator const &gen, Geom::Affine const &trans, int x0, int y0)
: _gen(gen)
, _trans(trans)
, _x0(x0), _y0(y0)
@@ -358,7 +358,7 @@ struct Turbulence {
}
private:
TurbulenceGenerator const &_gen;
- Geom::Matrix _trans;
+ Geom::Affine _trans;
int _x0, _y0;
};
@@ -375,8 +375,7 @@ void FilterTurbulence::render_cairo(FilterSlot &slot)
type == TURBULENCE_FRACTALNOISE, numOctaves);
}
- // TODO: convert this to ink_cairo_surface_synthesize
- Geom::Matrix unit_trans = slot.get_units().get_matrix_primitiveunits2pb().inverse();
+ Geom::Affine unit_trans = slot.get_units().get_matrix_primitiveunits2pb().inverse();
NRRectL const &slot_area = slot.get_slot_area();
ink_cairo_surface_synthesize(out, Turbulence(*gen, unit_trans, slot_area.x0, slot_area.y0));
diff --git a/src/display/nr-filter-units.cpp b/src/display/nr-filter-units.cpp
index 4cf165800..b1c475c41 100644
--- a/src/display/nr-filter-units.cpp
+++ b/src/display/nr-filter-units.cpp
@@ -35,7 +35,7 @@ FilterUnits::FilterUnits(SPFilterUnits const filterUnits, SPFilterUnits const pr
paraller_axis(false), automatic_resolution(true)
{}
-void FilterUnits::set_ctm(Geom::Matrix const &ctm) {
+void FilterUnits::set_ctm(Geom::Affine const &ctm) {
this->ctm = ctm;
}
@@ -63,12 +63,12 @@ void FilterUnits::set_automatic_resolution(bool const automatic) {
automatic_resolution = automatic;
}
-Geom::Matrix FilterUnits::get_matrix_user2pb() const {
+Geom::Affine FilterUnits::get_matrix_user2pb() const {
g_assert(resolution_x > 0);
g_assert(resolution_y > 0);
g_assert(filter_area);
- Geom::Matrix u2pb = ctm;
+ Geom::Affine u2pb = ctm;
if (paraller_axis || !automatic_resolution) {
u2pb[0] = resolution_x / (filter_area->max()[X] - filter_area->min()[X]);
@@ -82,9 +82,9 @@ Geom::Matrix FilterUnits::get_matrix_user2pb() const {
return u2pb;
}
-Geom::Matrix FilterUnits::get_matrix_units2pb(SPFilterUnits units) const {
+Geom::Affine FilterUnits::get_matrix_units2pb(SPFilterUnits units) const {
if ( item_bbox && (units == SP_FILTER_UNITS_OBJECTBOUNDINGBOX) ) {
- Geom::Matrix u2pb = get_matrix_user2pb();
+ Geom::Affine u2pb = get_matrix_user2pb();
Geom::Point origo(item_bbox->min());
origo *= u2pb;
Geom::Point i_end(item_bbox->max()[X], item_bbox->min()[Y]);
@@ -106,31 +106,31 @@ Geom::Matrix FilterUnits::get_matrix_units2pb(SPFilterUnits units) const {
return get_matrix_user2pb();
} else {
g_warning("Error in Inkscape::Filters::FilterUnits::get_matrix_units2pb: unrecognized unit type (%d)", units);
- return Geom::Matrix();
+ return Geom::Affine();
}
}
-Geom::Matrix FilterUnits::get_matrix_filterunits2pb() const {
+Geom::Affine FilterUnits::get_matrix_filterunits2pb() const {
return get_matrix_units2pb(filterUnits);
}
-Geom::Matrix FilterUnits::get_matrix_primitiveunits2pb() const {
+Geom::Affine FilterUnits::get_matrix_primitiveunits2pb() const {
return get_matrix_units2pb(primitiveUnits);
}
-Geom::Matrix FilterUnits::get_matrix_display2pb() const {
- Geom::Matrix d2pb = ctm.inverse();
+Geom::Affine FilterUnits::get_matrix_display2pb() const {
+ Geom::Affine d2pb = ctm.inverse();
d2pb *= get_matrix_user2pb();
return d2pb;
}
-Geom::Matrix FilterUnits::get_matrix_pb2display() const {
- Geom::Matrix pb2d = get_matrix_user2pb().inverse();
+Geom::Affine FilterUnits::get_matrix_pb2display() const {
+ Geom::Affine pb2d = get_matrix_user2pb().inverse();
pb2d *= ctm;
return pb2d;
}
-Geom::Matrix FilterUnits::get_matrix_user2units(SPFilterUnits units) const {
+Geom::Affine FilterUnits::get_matrix_user2units(SPFilterUnits units) const {
if (item_bbox && units == SP_FILTER_UNITS_OBJECTBOUNDINGBOX) {
/* No need to worry about rotations: bounding box coordinates
* always have base vectors paraller with userspace coordinates */
@@ -139,22 +139,22 @@ Geom::Matrix FilterUnits::get_matrix_user2units(SPFilterUnits units) const {
double scale_x = 1.0 / (max[X] - min[X]);
double scale_y = 1.0 / (max[Y] - min[Y]);
//return Geom::Translate(min) * Geom::Scale(scale_x,scale_y); ?
- return Geom::Matrix(scale_x, 0,
+ return Geom::Affine(scale_x, 0,
0, scale_y,
min[X] * scale_x, min[Y] * scale_y);
} else if (units == SP_FILTER_UNITS_USERSPACEONUSE) {
return Geom::identity();
} else {
g_warning("Error in Inkscape::Filters::FilterUnits::get_matrix_user2units: unrecognized unit type (%d)", units);
- return Geom::Matrix();
+ return Geom::Affine();
}
}
-Geom::Matrix FilterUnits::get_matrix_user2filterunits() const {
+Geom::Affine FilterUnits::get_matrix_user2filterunits() const {
return get_matrix_user2units(filterUnits);
}
-Geom::Matrix FilterUnits::get_matrix_user2primitiveunits() const {
+Geom::Affine FilterUnits::get_matrix_user2primitiveunits() const {
return get_matrix_user2units(primitiveUnits);
}
@@ -162,7 +162,7 @@ NR::IRect FilterUnits::get_pixblock_filterarea_paraller() const {
g_assert(filter_area);
int min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN;
- Geom::Matrix u2pb = get_matrix_user2pb();
+ Geom::Affine u2pb = get_matrix_user2pb();
for (int i = 0 ; i < 4 ; i++) {
Geom::Point p = filter_area->corner(i);
diff --git a/src/display/nr-filter-units.h b/src/display/nr-filter-units.h
index 7ef6190fc..2fc3e5533 100644
--- a/src/display/nr-filter-units.h
+++ b/src/display/nr-filter-units.h
@@ -14,7 +14,7 @@
#include "sp-filter-units.h"
#include "libnr/nr-rect-l.h"
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include <2geom/rect.h>
namespace Inkscape {
@@ -41,7 +41,7 @@ public:
* Sets the current transformation matrix, i.e. transformation matrix
* from object's user coordinates to screen coordinates
*/
- void set_ctm(Geom::Matrix const &ctm);
+ void set_ctm(Geom::Affine const &ctm);
/**
* Sets the resolution, the filter should be rendered with.
@@ -72,41 +72,61 @@ public:
void set_automatic_resolution(bool const automatic);
/**
+ * Gets the item bounding box in user coordinates
+ */
+ Geom::OptRect get_item_bbox() const { return item_bbox; };
+
+ /**
+ * Gets the filter effects area in user coordinates
+ */
+ Geom::OptRect get_filter_area() const { return filter_area; };
+
+ /**
+ * Gets Filter Units (userSpaceOnUse or objectBoundingBox)
+ */
+ SPFilterUnits get_filter_units() const { return filterUnits; };
+
+ /**
+ * Gets Primitive Units (userSpaceOnUse or objectBoundingBox)
+ */
+ SPFilterUnits get_primitive_units() const { return primitiveUnits; };
+
+ /**
* Gets the user coordinates to pixblock coordinates transformation matrix.
*/
- Geom::Matrix get_matrix_user2pb() const;
+ Geom::Affine get_matrix_user2pb() const;
/**
* Gets the filterUnits to pixblock coordinates transformation matrix.
*/
- Geom::Matrix get_matrix_filterunits2pb() const;
+ Geom::Affine get_matrix_filterunits2pb() const;
/**
* Gets the primitiveUnits to pixblock coordinates transformation matrix.
*/
- Geom::Matrix get_matrix_primitiveunits2pb() const;
+ Geom::Affine get_matrix_primitiveunits2pb() const;
/**
* Gets the display coordinates to pixblock coordinates transformation
* matrix.
*/
- Geom::Matrix get_matrix_display2pb() const;
+ Geom::Affine get_matrix_display2pb() const;
/**
* Gets the pixblock coordinates to display coordinates transformation
* matrix
*/
- Geom::Matrix get_matrix_pb2display() const;
+ Geom::Affine get_matrix_pb2display() const;
/**
* Gets the user coordinates to filterUnits transformation matrix.
*/
- Geom::Matrix get_matrix_user2filterunits() const;
+ Geom::Affine get_matrix_user2filterunits() const;
/**
* Gets the user coordinates to primitiveUnits transformation matrix.
*/
- Geom::Matrix get_matrix_user2primitiveunits() const;
+ Geom::Affine get_matrix_user2primitiveunits() const;
/**
* Returns the filter area in pixblock coordinates.
@@ -118,14 +138,14 @@ public:
FilterUnits& operator=(FilterUnits const &other);
private:
- Geom::Matrix get_matrix_units2pb(SPFilterUnits units) const;
- Geom::Matrix get_matrix_user2units(SPFilterUnits units) const;
+ Geom::Affine get_matrix_units2pb(SPFilterUnits units) const;
+ Geom::Affine get_matrix_user2units(SPFilterUnits units) const;
SPFilterUnits filterUnits, primitiveUnits;
double resolution_x, resolution_y;
bool paraller_axis;
bool automatic_resolution;
- Geom::Matrix ctm;
+ Geom::Affine ctm;
Geom::OptRect item_bbox;
Geom::OptRect filter_area;
diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp
index 5e8419ef4..55190b00c 100644
--- a/src/display/nr-filter.cpp
+++ b/src/display/nr-filter.cpp
@@ -42,7 +42,7 @@
#include "display/nr-arena.h"
#include "display/nr-arena-item.h"
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include <2geom/rect.h>
#include "svg/svg-length.h"
#include "sp-filter-units.h"
@@ -112,7 +112,7 @@ int Filter::render(NRArenaItem const *item, cairo_t *bgct, NRRectL const *bgarea
FilterQuality const filterquality = (FilterQuality)item->arena->filterquality;
int const blurquality = item->arena->blurquality;
- Geom::Matrix trans = item->ctm;
+ Geom::Affine trans = item->ctm;
Geom::Rect item_bbox;
{
@@ -154,7 +154,7 @@ int Filter::render(NRArenaItem const *item, cairo_t *bgct, NRRectL const *bgarea
}
units.set_paraller(false);
- Geom::Matrix pbtrans = units.get_matrix_display2pb();
+ Geom::Affine pbtrans = units.get_matrix_display2pb();
for (unsigned i = 0 ; i < _primitive.size() ; i++) {
if (!_primitive[i]->can_handle_affine(pbtrans)) {
units.set_paraller(true);
@@ -283,7 +283,7 @@ Geom::Rect Filter::filter_effect_area(Geom::Rect const &bbox)
minp[Y] = _region_y.computed;
maxp[Y] = minp[Y] + _region_height.computed;
} else {
- g_warning("Error in Inkscape::Filters::Filter::bbox_enlarge: unrecognized value of _filter_units");
+ g_warning("Error in Inkscape::Filters::Filter::filter_effect_area: unrecognized value of _filter_units");
}
Geom::Rect area(minp, maxp);
return area;
@@ -432,7 +432,7 @@ int Filter::_resolution_limit(FilterQuality const quality) const {
}
std::pair<double,double> Filter::_filter_resolution(
- Geom::Rect const &area, Geom::Matrix const &trans,
+ Geom::Rect const &area, Geom::Affine const &trans,
FilterQuality const filterquality) const
{
std::pair<double,double> resolution;
diff --git a/src/display/nr-filter.h b/src/display/nr-filter.h
index ac434b402..e1d4c10e5 100644
--- a/src/display/nr-filter.h
+++ b/src/display/nr-filter.h
@@ -96,8 +96,8 @@ public:
* If any of these parameters does not get set, the default value, as
* defined in SVG standard, for that parameter is used instead.
*/
- void set_region(SVGLength &x, SVGLength &y,
- SVGLength &width, SVGLength &height);
+ void set_region(SVGLength const &x, SVGLength const &y,
+ SVGLength const &width, SVGLength const &height);
/**
* Resets the filter effects region to its default value as defined
@@ -135,7 +135,7 @@ public:
void set_filter_units(SPFilterUnits unit);
/**
- * Set the primitiveUnits-properterty. If not set, the default value of
+ * Set the primitiveUnits-property. If not set, the default value of
* userSpaceOnUse is used. If the parameter value is not a valid
* enumeration value from SPFilterUnits, no changes to filter state
* are made.
@@ -201,7 +201,7 @@ private:
void _common_init();
int _resolution_limit(FilterQuality const quality) const;
std::pair<double,double> _filter_resolution(Geom::Rect const &area,
- Geom::Matrix const &trans,
+ Geom::Affine const &trans,
FilterQuality const q) const;
};
diff --git a/src/display/nr-light.cpp b/src/display/nr-light.cpp
index 0c801d736..65912470d 100644
--- a/src/display/nr-light.cpp
+++ b/src/display/nr-light.cpp
@@ -43,7 +43,7 @@ void DistantLight::light_components(NR::Fvector &lc) {
lc[LIGHT_BLUE] = SP_RGBA32_B_U(color);
}
-PointLight::PointLight(SPFePointLight *light, guint32 lighting_color, const Geom::Matrix &trans) {
+PointLight::PointLight(SPFePointLight *light, guint32 lighting_color, const Geom::Affine &trans) {
color = lighting_color;
l_x = light->x;
l_y = light->y;
@@ -66,7 +66,7 @@ void PointLight::light_components(NR::Fvector &lc) {
lc[LIGHT_BLUE] = SP_RGBA32_B_U(color);
}
-SpotLight::SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::Matrix &trans) {
+SpotLight::SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::Affine &trans) {
gdouble p_x, p_y, p_z;
color = lighting_color;
l_x = light->x;
diff --git a/src/display/nr-light.h b/src/display/nr-light.h
index 65c341a7e..49130cc4e 100644
--- a/src/display/nr-light.h
+++ b/src/display/nr-light.h
@@ -68,7 +68,7 @@ class PointLight {
* employed in the sp light object) and current coordinate (those
* employed in the rendering)
*/
- PointLight(SPFePointLight *light, guint32 lighting_color, const Geom::Matrix &trans);
+ PointLight(SPFePointLight *light, guint32 lighting_color, const Geom::Affine &trans);
virtual ~PointLight();
/**
* Computes the light vector of the distant light at point (x,y,z).
@@ -108,7 +108,7 @@ class SpotLight {
* employed in the sp light object) and current coordinate (those
* employed in the rendering)
*/
- SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::Matrix &trans);
+ SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::Affine &trans);
virtual ~SpotLight();
/**
diff --git a/src/display/nr-svgfonts.cpp b/src/display/nr-svgfonts.cpp
index f3207cf18..b33835f64 100644
--- a/src/display/nr-svgfonts.cpp
+++ b/src/display/nr-svgfonts.cpp
@@ -253,7 +253,7 @@ SvgFont::scaled_font_render_glyph (cairo_scaled_font_t */*scaled_font*/,
// Geom::Scale s(1.0/((SPFont*) node->parent)->horiz_adv_x);
Geom::Scale s(1.0/1000);//TODO: use here the units-per-em attribute?
//This matrix flips the glyph vertically
- Geom::Matrix m(Geom::Coord(1),Geom::Coord(0),Geom::Coord(0),Geom::Coord(-1),Geom::Coord(0),Geom::Coord(0));
+ Geom::Affine m(Geom::Coord(1),Geom::Coord(0),Geom::Coord(0),Geom::Coord(-1),Geom::Coord(0),Geom::Coord(0));
//then we offset it
// pathv += Geom::Point(Geom::Coord(0),Geom::Coord(-((SPFont*) node->parent)->horiz_adv_x));
pathv += Geom::Point(Geom::Coord(0),Geom::Coord(-1000));//TODO: use here the units-per-em attribute?
diff --git a/src/display/rendermode.h b/src/display/rendermode.h
index abcdb3db4..8fc022bfb 100644
--- a/src/display/rendermode.h
+++ b/src/display/rendermode.h
@@ -12,8 +12,13 @@ namespace Inkscape {
enum RenderMode {
RENDERMODE_NORMAL,
RENDERMODE_NO_FILTERS,
- RENDERMODE_OUTLINE,
- RENDERMODE_PRINT_COLORS_PREVIEW
+ RENDERMODE_OUTLINE
+};
+
+enum ColorRenderMode {
+ COLORRENDERMODE_NORMAL,
+ COLORRENDERMODE_GRAYSCALE,
+ COLORRENDERMODE_PRINT_COLORS_PREVIEW
};
}
diff --git a/src/display/snap-indicator.h b/src/display/snap-indicator.h
index 5475f9f60..d60ff1481 100644
--- a/src/display/snap-indicator.h
+++ b/src/display/snap-indicator.h
@@ -15,12 +15,13 @@
*/
#include "forward.h"
-#include "display/display-forward.h"
#include "snapped-point.h"
namespace Inkscape {
namespace Display {
+class TemporaryItem;
+
class SnapIndicator {
public:
SnapIndicator(SPDesktop *desktop);
diff --git a/src/display/sodipodi-ctrl.cpp b/src/display/sodipodi-ctrl.cpp
index ce4df98c6..a165fd52e 100644
--- a/src/display/sodipodi-ctrl.cpp
+++ b/src/display/sodipodi-ctrl.cpp
@@ -10,7 +10,6 @@
#include <2geom/transforms.h>
#include "sp-canvas-util.h"
-#include "display-forward.h"
#include "sodipodi-ctrl.h"
#include "display/cairo-utils.h"
@@ -33,7 +32,7 @@ static void sp_ctrl_init (SPCtrl *ctrl);
static void sp_ctrl_destroy (GtkObject *object);
static void sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-static void sp_ctrl_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_ctrl_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
@@ -217,7 +216,7 @@ sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
}
static void
-sp_ctrl_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCtrl *ctrl;
gint x, y;
@@ -544,7 +543,7 @@ sp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf)
void SPCtrl::moveto (Geom::Point const p) {
if (p != _point) {
- sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (this), Geom::Matrix(Geom::Translate (p)));
+ sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (this), Geom::Affine(Geom::Translate (p)));
_moved = true;
}
_point = p;
diff --git a/src/display/sodipodi-ctrl.h b/src/display/sodipodi-ctrl.h
index f9deffd56..27728296a 100644
--- a/src/display/sodipodi-ctrl.h
+++ b/src/display/sodipodi-ctrl.h
@@ -8,10 +8,9 @@
*/
#include <gtk/gtkenums.h>
-#include "sp-canvas.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <libnr/nr-rect-l.h>
-
+#include "sp-canvas-item.h"
#define SP_TYPE_CTRL (sp_ctrl_get_type ())
@@ -35,7 +34,7 @@ typedef enum {
SP_CTRL_MODE_XOR
} SPCtrlModeType;
-struct SPCtrl : public SPCanvasItem{
+struct SPCtrl : public SPCanvasItem {
SPCtrlShapeType shape;
SPCtrlModeType mode;
GtkAnchorType anchor;
diff --git a/src/display/sodipodi-ctrlrect.cpp b/src/display/sodipodi-ctrlrect.cpp
index 504a1bc92..592d45bc0 100644
--- a/src/display/sodipodi-ctrlrect.cpp
+++ b/src/display/sodipodi-ctrlrect.cpp
@@ -15,7 +15,6 @@
*
*/
-#include "display-forward.h"
#include "sp-canvas-util.h"
#include "sodipodi-ctrlrect.h"
#include "display/cairo-utils.h"
@@ -31,7 +30,7 @@ static void sp_ctrlrect_class_init(SPCtrlRectClass *c);
static void sp_ctrlrect_init(CtrlRect *ctrlrect);
static void sp_ctrlrect_destroy(GtkObject *object);
-static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class;
@@ -162,7 +161,7 @@ static void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf)
}
-static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SP_CTRLRECT(item)->update(affine, flags);
}
@@ -248,7 +247,7 @@ void CtrlRect::render(SPCanvasBuf *buf)
}
-void CtrlRect::update(Geom::Matrix const &affine, unsigned int flags)
+void CtrlRect::update(Geom::Affine const &affine, unsigned int flags)
{
if (((SPCanvasItemClass *) parent_class)->update) {
((SPCanvasItemClass *) parent_class)->update(this, affine, flags);
diff --git a/src/display/sodipodi-ctrlrect.h b/src/display/sodipodi-ctrlrect.h
index 70dcf1f30..2ba73a4c9 100644
--- a/src/display/sodipodi-ctrlrect.h
+++ b/src/display/sodipodi-ctrlrect.h
@@ -1,5 +1,5 @@
-#ifndef __INKSCAPE_CTRLRECT_H__
-#define __INKSCAPE_CTRLRECT_H__
+#ifndef SEEN_INKSCAPE_CTRLRECT_H
+#define SEEN_INKSCAPE_CTRLRECT_H
/**
* \file sodipodi-ctrlrect.h
@@ -17,7 +17,10 @@
*/
#include <glib/gtypes.h>
-#include "sp-canvas.h"
+#include "sp-canvas-item.h"
+#include "libnr/nr-rect-l.h"
+
+struct SPCanvasBuf;
#define SP_TYPE_CTRLRECT (sp_ctrlrect_get_type ())
#define SP_CTRLRECT(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CTRLRECT, CtrlRect))
@@ -36,7 +39,7 @@ public:
void setDashed(bool d);
void render(SPCanvasBuf *buf);
- void update(Geom::Matrix const &affine, unsigned int flags);
+ void update(Geom::Affine const &affine, unsigned int flags);
private:
void _requestUpdate();
@@ -56,7 +59,7 @@ struct SPCtrlRectClass : public SPCanvasItemClass {};
GtkType sp_ctrlrect_get_type();
-#endif
+#endif // SEEN_RUBBERBAND_H
/*
Local Variables:
diff --git a/src/display/sp-canvas-group.h b/src/display/sp-canvas-group.h
new file mode 100644
index 000000000..10bf0fa6c
--- /dev/null
+++ b/src/display/sp-canvas-group.h
@@ -0,0 +1,45 @@
+#ifndef SEEN_SP_CANVAS_GROUP_H
+#define SEEN_SP_CANVAS_GROUP_H
+
+/** \file
+ * SPCanvasGroup
+ *
+ * Authors:
+ * Federico Mena <federico@nuclecu.unam.mx>
+ * Raph Levien <raph@gimp.org>
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 1998 The Free Software Foundation
+ * Copyright (C) 2002 Lauris Kaplinski
+ * Copyright (C) 2010 authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib-object.h>
+
+#define SP_TYPE_CANVAS_GROUP (sp_canvas_group_get_type())
+#define SP_CANVAS_GROUP(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS_GROUP, SPCanvasGroup))
+#define SP_IS_CANVAS_GROUP(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS_GROUP))
+
+GType sp_canvas_group_get_type();
+
+
+
+#endif // SEEN_SP_CANVAS_GROUP_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/display/sp-canvas-item.h b/src/display/sp-canvas-item.h
new file mode 100644
index 000000000..cc0bdfc77
--- /dev/null
+++ b/src/display/sp-canvas-item.h
@@ -0,0 +1,110 @@
+#ifndef SEEN_SP_CANVAS_ITEM_H
+#define SEEN_SP_CANVAS_ITEM_H
+
+/** \file
+ * SPCanvasItem.
+ *
+ * Authors:
+ * Federico Mena <federico@nuclecu.unam.mx>
+ * Raph Levien <raph@gimp.org>
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 1998 The Free Software Foundation
+ * Copyright (C) 2002 Lauris Kaplinski
+ * Copyright (C) 2010 authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib-object.h>
+#include <gtk/gtkobject.h>
+#include <gdk/gdkevents.h>
+
+#include "2geom/rect.h"
+
+G_BEGIN_DECLS
+
+struct SPCanvas;
+struct SPCanvasBuf;
+struct SPCanvasGroup;
+
+typedef struct _SPCanvasItemClass SPCanvasItemClass;
+
+#define SP_TYPE_CANVAS_ITEM (sp_canvas_item_get_type())
+#define SP_CANVAS_ITEM(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS_ITEM, SPCanvasItem))
+#define SP_IS_CANVAS_ITEM(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS_ITEM))
+#define SP_CANVAS_ITEM_GET_CLASS(o) (GTK_CHECK_GET_CLASS((o), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
+
+GType sp_canvas_item_get_type();
+
+/**
+ * An SPCanvasItem refers to a SPCanvas and to its parent item; it has
+ * four coordinates, a bounding rectangle, and a transformation matrix.
+ */
+struct SPCanvasItem : public GtkObject {
+ SPCanvas *canvas;
+ SPCanvasItem *parent;
+
+ double x1, y1, x2, y2;
+ Geom::Rect bounds;
+ Geom::Affine xform;
+};
+
+/**
+ * The vtable of an SPCanvasItem.
+ */
+struct _SPCanvasItemClass : public GtkObjectClass {
+ void (* update) (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
+
+ void (* render) (SPCanvasItem *item, SPCanvasBuf *buf);
+ double (* point) (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
+
+ int (* event) (SPCanvasItem *item, GdkEvent *event);
+};
+
+SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GtkType type, const gchar *first_arg_name, ...);
+
+G_END_DECLS
+
+
+#define sp_canvas_item_set gtk_object_set
+
+void sp_canvas_item_affine_absolute(SPCanvasItem *item, Geom::Affine const &aff);
+
+void sp_canvas_item_raise(SPCanvasItem *item, int positions);
+void sp_canvas_item_lower(SPCanvasItem *item, int positions);
+bool sp_canvas_item_is_visible(SPCanvasItem *item);
+void sp_canvas_item_show(SPCanvasItem *item);
+void sp_canvas_item_hide(SPCanvasItem *item);
+int sp_canvas_item_grab(SPCanvasItem *item, unsigned int event_mask, GdkCursor *cursor, guint32 etime);
+void sp_canvas_item_ungrab(SPCanvasItem *item, guint32 etime);
+
+Geom::Affine sp_canvas_item_i2w_affine(SPCanvasItem const *item);
+
+void sp_canvas_item_grab_focus(SPCanvasItem *item);
+
+void sp_canvas_item_request_update(SPCanvasItem *item);
+
+/* get item z-order in parent group */
+
+gint sp_canvas_item_order(SPCanvasItem * item);
+
+
+
+#endif // SEEN_SP_CANVAS_ITEM_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/display/sp-canvas-util.cpp b/src/display/sp-canvas-util.cpp
index 23b92c35d..186609e49 100644
--- a/src/display/sp-canvas-util.cpp
+++ b/src/display/sp-canvas-util.cpp
@@ -13,10 +13,10 @@
*/
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include "sp-canvas-util.h"
-#include <string.h> /* for memset */
-
+#include "sp-canvas-item.h"
+#include "sp-canvas.h"
void
sp_canvas_update_bbox (SPCanvasItem *item, int x1, int y1, int x2, int y2)
@@ -50,7 +50,7 @@ sp_canvas_prepare_buffer (SPCanvasBuf *buf)
}*/
}
-Geom::Matrix sp_canvas_item_i2p_affine (SPCanvasItem * item)
+Geom::Affine sp_canvas_item_i2p_affine (SPCanvasItem * item)
{
g_assert (item != NULL); /* this may be overly zealous - it is
* plausible that this gets called
@@ -59,7 +59,7 @@ Geom::Matrix sp_canvas_item_i2p_affine (SPCanvasItem * item)
return item->xform;
}
-Geom::Matrix sp_canvas_item_i2i_affine (SPCanvasItem * from, SPCanvasItem * to)
+Geom::Affine sp_canvas_item_i2i_affine (SPCanvasItem * from, SPCanvasItem * to)
{
g_assert (from != NULL);
g_assert (to != NULL);
@@ -67,7 +67,7 @@ Geom::Matrix sp_canvas_item_i2i_affine (SPCanvasItem * from, SPCanvasItem * to)
return sp_canvas_item_i2w_affine(from) * sp_canvas_item_i2w_affine(to).inverse();
}
-void sp_canvas_item_set_i2w_affine (SPCanvasItem * item, Geom::Matrix const &i2w)
+void sp_canvas_item_set_i2w_affine (SPCanvasItem * item, Geom::Affine const &i2w)
{
g_assert (item != NULL);
diff --git a/src/display/sp-canvas-util.h b/src/display/sp-canvas-util.h
index 82b85f1d8..41e085a5c 100644
--- a/src/display/sp-canvas-util.h
+++ b/src/display/sp-canvas-util.h
@@ -23,15 +23,15 @@ void sp_canvas_prepare_buffer (SPCanvasBuf *buf);
/* get i2p (item to parent) affine transformation as general 6-element array */
-Geom::Matrix sp_canvas_item_i2p_affine (SPCanvasItem * item);
+Geom::Affine sp_canvas_item_i2p_affine (SPCanvasItem * item);
/* get i2i (item to item) affine transformation as general 6-element array */
-Geom::Matrix sp_canvas_item_i2i_affine (SPCanvasItem * from, SPCanvasItem * to);
+Geom::Affine sp_canvas_item_i2i_affine (SPCanvasItem * from, SPCanvasItem * to);
/* set item affine matrix to achieve given i2w matrix */
-void sp_canvas_item_set_i2w_affine (SPCanvasItem * item, Geom::Matrix const & aff);
+void sp_canvas_item_set_i2w_affine (SPCanvasItem * item, Geom::Affine const & aff);
void sp_canvas_item_move_to_z (SPCanvasItem * item, gint z);
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index d2fd2fa3d..43f33b74e 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -1,5 +1,3 @@
-#define __SP_CANVAS_C__
-
/** \file
* Port of GnomeCanvas for Inkscape needs
*
@@ -28,9 +26,10 @@
#include "helper/sp-marshal.h"
#include <helper/recthull.h>
-#include <display/sp-canvas.h>
#include "display-forward.h"
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
+#include "display/sp-canvas.h"
+#include "display/sp-canvas-group.h"
#include "preferences.h"
#include "inkscape.h"
#include "sodipodi-ctrlrect.h"
@@ -169,7 +168,7 @@ sp_canvas_item_init (SPCanvasItem *item)
// that should be initially invisible; examples of such items: node handles, the CtrlRect
// used for rubberbanding, path outline, etc.
item->flags |= SP_CANVAS_ITEM_VISIBLE;
- item->xform = Geom::Matrix(Geom::identity());
+ item->xform = Geom::Affine(Geom::identity());
}
/**
@@ -282,10 +281,10 @@ sp_canvas_item_dispose (GObject *object)
* NB! affine is parent2canvas.
*/
static void
-sp_canvas_item_invoke_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_canvas_item_invoke_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
/* Apply the child item's transform */
- Geom::Matrix child_affine = item->xform * affine;
+ Geom::Affine child_affine = item->xform * affine;
/* apply object flags to child flags */
int child_flags = flags & ~SP_CANVAS_UPDATE_REQUESTED;
@@ -329,7 +328,7 @@ sp_canvas_item_invoke_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **a
* @affine: An affine transformation matrix.
*/
void
-sp_canvas_item_affine_absolute (SPCanvasItem *item, Geom::Matrix const &affine)
+sp_canvas_item_affine_absolute (SPCanvasItem *item, Geom::Affine const &affine)
{
item->xform = affine;
@@ -596,11 +595,11 @@ sp_canvas_item_ungrab (SPCanvasItem *item, guint32 etime)
* Returns the product of all transformation matrices from the root item down
* to the item.
*/
-Geom::Matrix sp_canvas_item_i2w_affine(SPCanvasItem const *item)
+Geom::Affine sp_canvas_item_i2w_affine(SPCanvasItem const *item)
{
g_assert (SP_IS_CANVAS_ITEM (item)); // should we get this?
- Geom::Matrix affine = Geom::identity();
+ Geom::Affine affine = Geom::identity();
while (item) {
affine *= item->xform;
@@ -695,7 +694,7 @@ static void sp_canvas_group_class_init (SPCanvasGroupClass *klass);
static void sp_canvas_group_init (SPCanvasGroup *group);
static void sp_canvas_group_destroy (GtkObject *object);
-static void sp_canvas_group_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_canvas_group_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static double sp_canvas_group_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
static void sp_canvas_group_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -780,7 +779,7 @@ sp_canvas_group_destroy (GtkObject *object)
* Update handler for canvas groups
*/
static void
-sp_canvas_group_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_canvas_group_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCanvasGroup const *group = SP_CANVAS_GROUP (item);
Geom::RectHull corners(Geom::Point(0, 0));
@@ -846,6 +845,12 @@ sp_canvas_group_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_
} else
has_point = FALSE;
+ // This metric should be improved, because in case of (partly) overlapping items we will now
+ // always select the last one that has been added to the group. We could instead select the one
+ // of which the center is the closest, for example. One can then move to the center
+ // of the item to be focused, and have that one selected. Of course this will only work if the
+ // centers are not coincident, but at least it's better than what we have now.
+ // See the extensive comment in Inkscape::SelTrans::_updateHandles()
if (has_point && point_item && ((int) (dist + 0.5) <= item->canvas->close_enough)) {
best = dist;
*actual_item = point_item;
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index 74476950f..53b8a61f1 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -2,7 +2,7 @@
#define SEEN_SP_CANVAS_H
/** \file
- * SPCanvas, SPCanvasBuf, and SPCanvasItem.
+ * SPCanvas, SPCanvasBuf.
*
* Authors:
* Federico Mena <federico@nuclecu.unam.mx>
@@ -35,16 +35,22 @@
#include <glibmm/ustring.h>
-#include <2geom/matrix.h>
+#include <2geom/affine.h>
#include <libnr/nr-rect-l.h>
#include <2geom/rect.h>
G_BEGIN_DECLS
+#define SP_TYPE_CANVAS sp_canvas_get_type()
+#define SP_CANVAS(obj) (GTK_CHECK_CAST((obj), SP_TYPE_CANVAS, SPCanvas))
+#define SP_IS_CANVAS(obj) (GTK_CHECK_TYPE((obj), SP_TYPE_CANVAS))
+
+GType sp_canvas_get_type();
+
struct SPCanvas;
+struct SPCanvasItem;
struct SPCanvasGroup;
-typedef struct _SPCanvasItemClass SPCanvasItemClass;
enum {
SP_CANVAS_UPDATE_REQUESTED = 1 << 0,
@@ -64,58 +70,8 @@ struct SPCanvasBuf {
bool is_empty;
};
-/**
- * An SPCanvasItem refers to a SPCanvas and to its parent item; it has
- * four coordinates, a bounding rectangle, and a transformation matrix.
- */
-struct SPCanvasItem : public GtkObject {
- SPCanvas *canvas;
- SPCanvasItem *parent;
-
- double x1, y1, x2, y2;
- Geom::Rect bounds;
- Geom::Matrix xform;
-};
-
-/**
- * The vtable of an SPCanvasItem.
- */
-struct _SPCanvasItemClass : public GtkObjectClass {
- void (* update) (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
-
- void (* render) (SPCanvasItem *item, SPCanvasBuf *buf);
- double (* point) (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
-
- int (* event) (SPCanvasItem *item, GdkEvent *event);
-};
-
-SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GtkType type, const gchar *first_arg_name, ...);
-
G_END_DECLS
-#define sp_canvas_item_set gtk_object_set
-
-void sp_canvas_item_affine_absolute(SPCanvasItem *item, Geom::Matrix const &aff);
-
-void sp_canvas_item_raise(SPCanvasItem *item, int positions);
-void sp_canvas_item_lower(SPCanvasItem *item, int positions);
-bool sp_canvas_item_is_visible(SPCanvasItem *item);
-void sp_canvas_item_show(SPCanvasItem *item);
-void sp_canvas_item_hide(SPCanvasItem *item);
-int sp_canvas_item_grab(SPCanvasItem *item, unsigned int event_mask, GdkCursor *cursor, guint32 etime);
-void sp_canvas_item_ungrab(SPCanvasItem *item, guint32 etime);
-
-Geom::Matrix sp_canvas_item_i2w_affine(SPCanvasItem const *item);
-
-void sp_canvas_item_grab_focus(SPCanvasItem *item);
-
-void sp_canvas_item_request_update(SPCanvasItem *item);
-
-/* get item z-order in parent group */
-
-gint sp_canvas_item_order(SPCanvasItem * item);
-
-
// SPCanvas -------------------------------------------------
/**
* Port of GnomeCanvas for inkscape needs.
@@ -185,6 +141,7 @@ struct SPCanvas {
bool drawing_disabled;
int rendermode;
+ int colorrendermode;
#if ENABLE_LCMS
bool enable_cms_display_adj;
diff --git a/src/display/sp-ctrlline.cpp b/src/display/sp-ctrlline.cpp
index f5ea225cc..6c763abdf 100644
--- a/src/display/sp-ctrlline.cpp
+++ b/src/display/sp-ctrlline.cpp
@@ -34,7 +34,7 @@ static void sp_ctrlline_class_init (SPCtrlLineClass *klass);
static void sp_ctrlline_init (SPCtrlLine *ctrlline);
static void sp_ctrlline_destroy (GtkObject *object);
-static void sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_ctrlline_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class;
@@ -120,7 +120,7 @@ sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf)
}
static void
-sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_ctrlline_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCtrlLine *cl = SP_CTRLLINE (item);
diff --git a/src/display/sp-ctrlline.h b/src/display/sp-ctrlline.h
index 64497c464..e69c478fb 100644
--- a/src/display/sp-ctrlline.h
+++ b/src/display/sp-ctrlline.h
@@ -1,5 +1,5 @@
-#ifndef __INKSCAPE_CTRLLINE_H__
-#define __INKSCAPE_CTRLLINE_H__
+#ifndef SEEN_INKSCAPE_CTRLLINE_H
+#define SEEN_INKSCAPE_CTRLLINE_H
/*
* Simple straight line
@@ -14,7 +14,7 @@
* Released under GNU GPL
*/
-#include "sp-canvas.h"
+#include "sp-canvas-item.h"
struct SPItem;
@@ -26,7 +26,7 @@ struct SPCtrlLine : public SPCanvasItem{
SPItem *item; // the item to which this line belongs in some sense; may be NULL for some users
guint32 rgba;
Geom::Point s, e;
- Geom::Matrix affine;
+ Geom::Affine affine;
};
struct SPCtrlLineClass : public SPCanvasItemClass{};
@@ -38,7 +38,7 @@ void sp_ctrlline_set_coords (SPCtrlLine *cl, const Geom::Point start, const Geom
-#endif
+#endif // SEEN_INKSCAPE_CTRLLINE_H
/*
Local Variables:
diff --git a/src/display/sp-ctrlpoint.cpp b/src/display/sp-ctrlpoint.cpp
index a5e93d07d..c33cdeeb9 100644
--- a/src/display/sp-ctrlpoint.cpp
+++ b/src/display/sp-ctrlpoint.cpp
@@ -11,7 +11,6 @@
* Released under GNU GPL
*/
-#include "display-forward.h"
#include "sp-canvas-util.h"
#include "sp-ctrlpoint.h"
@@ -26,7 +25,7 @@ static void sp_ctrlpoint_class_init (SPCtrlPointClass *klass);
static void sp_ctrlpoint_init (SPCtrlPoint *ctrlpoint);
static void sp_ctrlpoint_destroy (GtkObject *object);
-static void sp_ctrlpoint_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_ctrlpoint_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlpoint_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class;
@@ -111,7 +110,7 @@ sp_ctrlpoint_render (SPCanvasItem *item, SPCanvasBuf *buf)
}
static void
-sp_ctrlpoint_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_ctrlpoint_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCtrlPoint *cp = SP_CTRLPOINT (item);
diff --git a/src/display/sp-ctrlpoint.h b/src/display/sp-ctrlpoint.h
index d0e72f518..b98d48f67 100644
--- a/src/display/sp-ctrlpoint.h
+++ b/src/display/sp-ctrlpoint.h
@@ -1,5 +1,5 @@
-#ifndef __INKSCAPE_CTRLPOINT_H__
-#define __INKSCAPE_CTRLPOINT_H__
+#ifndef SEEN_INKSCAPE_CTRLPOINT_H
+#define SEEN_INKSCAPE_CTRLPOINT_H
/*
* A simple point
@@ -12,7 +12,7 @@
* Released under GNU GPL
*/
-#include "sp-canvas.h"
+#include "sp-canvas-item.h"
struct SPItem;
@@ -20,11 +20,11 @@ struct SPItem;
#define SP_CTRLPOINT(obj) (GTK_CHECK_CAST ((obj), SP_TYPE_CTRLPOINT, SPCtrlPoint))
#define SP_IS_CTRLPOINT(obj) (GTK_CHECK_TYPE ((obj), SP_TYPE_CTRLPOINT))
-struct SPCtrlPoint : public SPCanvasItem{
+struct SPCtrlPoint : public SPCanvasItem {
SPItem *item; // the item to which this line belongs in some sense; may be NULL for some users
guint32 rgba;
Geom::Point pt;
- Geom::Matrix affine;
+ Geom::Affine affine;
double radius;
};
struct SPCtrlPointClass : public SPCanvasItemClass{};
@@ -38,7 +38,7 @@ void sp_ctrlpoint_set_radius (SPCtrlPoint *cp, const double r);
-#endif
+#endif // SEEN_INKSCAPE_CTRLPOINT_H
/*
Local Variables:
diff --git a/src/display/sp-ctrlquadr.cpp b/src/display/sp-ctrlquadr.cpp
index 7a577a088..0701d0b10 100644
--- a/src/display/sp-ctrlquadr.cpp
+++ b/src/display/sp-ctrlquadr.cpp
@@ -1,5 +1,3 @@
-#define __INKSCAPE_CTRLQUADR_C__
-
/*
* Quadrilateral
*
@@ -16,6 +14,8 @@
#endif
#include "display-forward.h"
+#include "sp-canvas-item.h"
+#include "sp-canvas.h"
#include "sp-canvas-util.h"
#include "sp-ctrlquadr.h"
#include "display/cairo-utils.h"
@@ -24,7 +24,7 @@
struct SPCtrlQuadr : public SPCanvasItem{
guint32 rgba;
Geom::Point p1, p2, p3, p4;
- Geom::Matrix affine;
+ Geom::Affine affine;
};
struct SPCtrlQuadrClass : public SPCanvasItemClass{};
@@ -33,7 +33,7 @@ static void sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass);
static void sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr);
static void sp_ctrlquadr_destroy (GtkObject *object);
-static void sp_ctrlquadr_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
+static void sp_ctrlquadr_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class;
@@ -139,7 +139,7 @@ sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf)
static void
-sp_ctrlquadr_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
+sp_ctrlquadr_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCtrlQuadr *cq = SP_CTRLQUADR (item);