diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2011-04-07 23:42:04 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2011-04-07 23:42:04 +0000 |
| commit | 945ce419c806c73d70203dec33ececafbe108a92 (patch) | |
| tree | cfcdb59bf47e9db7f9e01f7eebb59924bdeaea94 /src/display | |
| parent | Merge from trunk (again) (diff) | |
| parent | Extensions. SVG+media fix (see Bug #400356). (diff) | |
| download | inkscape-945ce419c806c73d70203dec33ececafbe108a92.tar.gz inkscape-945ce419c806c73d70203dec33ececafbe108a92.zip | |
Merge from trunk
(bzr r9508.1.73)
Diffstat (limited to 'src/display')
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); |
