summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-08-15 01:19:33 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-08-15 01:19:33 +0000
commit2f3d79db2fad212c8aa1bff7bb13132a34541aff (patch)
treeec16b5e4cdd3d69dd6a0ee35b48e0379b679d4f2 /src
parentCompletely remove NRPixBlock (diff)
downloadinkscape-2f3d79db2fad212c8aa1bff7bb13132a34541aff.tar.gz
inkscape-2f3d79db2fad212c8aa1bff7bb13132a34541aff.zip
Make nr_arena_invoke_render expect an already transformed context,
to remove a limitation to integer translations imposed by NRRectL (bzr r9508.1.68)
Diffstat (limited to 'src')
-rw-r--r--src/dialogs/clonetiler.cpp1
-rw-r--r--src/display/canvas-arena.cpp5
-rw-r--r--src/display/nr-arena-glyphs.cpp10
-rw-r--r--src/display/nr-arena-image.cpp1
-rw-r--r--src/display/nr-arena-item.cpp11
-rw-r--r--src/display/nr-arena-shape.cpp16
-rw-r--r--src/display/nr-filter.cpp2
-rw-r--r--src/flood-context.cpp1
-rw-r--r--src/helper/png-write.cpp2
-rw-r--r--src/sp-pattern.cpp1
-rw-r--r--src/ui/cache/svg_preview_cache.cpp1
-rw-r--r--src/widgets/icon.cpp1
12 files changed, 25 insertions, 27 deletions
diff --git a/src/dialogs/clonetiler.cpp b/src/dialogs/clonetiler.cpp
index 3fe6b59e3..24a1682fe 100644
--- a/src/dialogs/clonetiler.cpp
+++ b/src/dialogs/clonetiler.cpp
@@ -905,6 +905,7 @@ clonetiler_trace_pick (Geom::Rect box)
cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
cairo_t *ct = cairo_create(s);
+ cairo_translate(ct, -ibox.x0, -ibox.y0);
/* Render */
nr_arena_item_invoke_render(ct, trace_root, &ibox, NULL,
NR_ARENA_ITEM_RENDER_NO_CACHE );
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index f1355b9c4..ac5e68379 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -209,8 +209,10 @@ sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf)
area.y1 = buf->rect.y1;
sp_canvas_prepare_buffer(buf);
-
+ cairo_save(buf->ct);
+ cairo_translate(buf->ct, -area.x0, -area.y0);
nr_arena_item_invoke_render (buf->ct, arena->root, &area, NULL, 0);
+ cairo_restore(buf->ct);
}
static double
@@ -363,6 +365,7 @@ sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, NRR
g_return_if_fail (SP_IS_CANVAS_ARENA (ca));
cairo_t *ct = cairo_create(surface);
+ cairo_translate(ct, -r.x0, -r.y0);
nr_arena_item_invoke_render (ct, ca->root, &r, NULL, 0);
cairo_destroy(ct);
}
diff --git a/src/display/nr-arena-glyphs.cpp b/src/display/nr-arena-glyphs.cpp
index d35489d70..a56b37406 100644
--- a/src/display/nr-arena-glyphs.cpp
+++ b/src/display/nr-arena-glyphs.cpp
@@ -298,9 +298,7 @@ nr_arena_glyphs_group_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPi
if (item->arena->rendermode == Inkscape::RENDERMODE_OUTLINE) {
guint32 rgba = item->arena->outlinecolor;
- // FIXME: we use RGBA buffers but cairo writes BGRA (on i386), so we must cheat
- // by setting color channels in the "wrong" order
- cairo_set_source_rgba(ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba));
+ ink_cairo_set_source_rgba32(ct, rgba);
cairo_set_tolerance(ct, 1.25); // low quality, but good enough for outline mode
NRRect temp(area->x0, area->y0, area->x1, area->y1);
@@ -310,10 +308,11 @@ 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;
cairo_new_path(ct);
- Geom::Matrix transform = g->g_transform * group->ctm;
- feed_pathvector_to_cairo (ct, *pathv, transform, area_2geom, false, 0);
+ ink_cairo_transform(ct, transform);
+ feed_pathvector_to_cairo (ct, *pathv);
cairo_fill(ct);
}
@@ -324,7 +323,6 @@ nr_arena_glyphs_group_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPi
bool has_stroke, has_fill;
cairo_save(ct);
- cairo_translate(ct, -area->x0, -area->y0);
ink_cairo_transform(ct, ggroup->ctm);
has_fill = ggroup->nrstyle.prepareFill(ct, &ggroup->paintbox);
diff --git a/src/display/nr-arena-image.cpp b/src/display/nr-arena-image.cpp
index 5f30e0560..fd75c8ff6 100644
--- a/src/display/nr-arena-image.cpp
+++ b/src/display/nr-arena-image.cpp
@@ -150,7 +150,6 @@ nr_arena_image_render( cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock
// FIXME: at the moment gdk_cairo_set_source_pixbuf creates an ARGB copy
// of the pixbuf. Fix this in Cairo and/or GDK.
cairo_save(ct);
- cairo_translate(ct, -area->x0, -area->y0);
ink_cairo_transform(ct, image->ctm);
cairo_new_path(ct);
diff --git a/src/display/nr-arena-item.cpp b/src/display/nr-arena-item.cpp
index 2aae21bf1..91c4391f6 100644
--- a/src/display/nr-arena-item.cpp
+++ b/src/display/nr-arena-item.cpp
@@ -414,6 +414,7 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area
cairo_get_target(ct), CAIRO_CONTENT_COLOR_ALPHA,
carea.x1 - carea.x0, carea.y1 - carea.y0);
this_ct = cairo_create(intermediate);
+ cairo_translate(this_ct, -carea.x0, -carea.y0);
this_area = &carea;
cairo_surface_destroy(intermediate); // the surface will be held in memory by this_ct
} else {
@@ -487,15 +488,9 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area
if (needs_intermediate_rendering) {
cairo_surface_t *intermediate = cairo_get_target(this_ct);
- cairo_set_source_surface(ct, intermediate, carea.x0 - area->x0, carea.y0 - area->y0);
+ cairo_set_source_surface(ct, intermediate, carea.x0, carea.y0);
if (mask) {
- // bring mask into the coordinate system of ct
- cairo_pattern_t *cmask = mask->cobj();
- cairo_matrix_t m;
- cairo_pattern_get_matrix(cmask, &m);
- cairo_matrix_translate(&m, area->x0 - carea.x0, area->y0 - carea.y0);
- cairo_pattern_set_matrix(cmask, &m);
- cairo_mask(ct, cmask);
+ cairo_mask(ct, mask->cobj());
// opacity of masked objects is handled by premultiplying the mask
} else {
diff --git a/src/display/nr-arena-shape.cpp b/src/display/nr-arena-shape.cpp
index 550195c7c..a39e9e6fc 100644
--- a/src/display/nr-arena-shape.cpp
+++ b/src/display/nr-arena-shape.cpp
@@ -309,7 +309,7 @@ nr_arena_shape_update(NRArenaItem *item, NRRectL *area, NRGC *gc, guint state, g
// cairo outline rendering:
static unsigned int
-cairo_arena_shape_render_outline(cairo_t *ct, NRArenaItem *item, Geom::OptRect area)
+cairo_arena_shape_render_outline(cairo_t *ct, NRArenaItem *item, Geom::OptRect /*area*/)
{
NRArenaShape *shape = NR_ARENA_SHAPE(item);
@@ -317,16 +317,14 @@ cairo_arena_shape_render_outline(cairo_t *ct, NRArenaItem *item, Geom::OptRect a
return item->state;
guint32 rgba = NR_ARENA_ITEM(shape)->arena->outlinecolor;
- // FIXME: we use RGBA buffers but cairo writes BGRA (on i386), so we must cheat
- // by setting color channels in the "wrong" order
- cairo_set_source_rgba(ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba));
+ cairo_save(ct);
+ ink_cairo_set_source_rgba32(ct, rgba);
+ ink_cairo_transform(ct, shape->ctm);
+ feed_pathvector_to_cairo (ct, shape->curve->get_pathvector());
+ cairo_restore(ct);
cairo_set_line_width(ct, 0.5);
cairo_set_tolerance(ct, 1.25); // low quality, but good enough for outline mode
- cairo_new_path(ct);
-
- feed_pathvector_to_cairo (ct, shape->curve->get_pathvector(), shape->ctm, area, true, 0);
-
cairo_stroke(ct);
return item->state;
@@ -362,7 +360,6 @@ nr_arena_shape_render(cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock
bool has_stroke, has_fill;
// we assume the context has no path
cairo_save(ct);
- cairo_translate(ct, -area->x0, -area->y0);
ink_cairo_transform(ct, shape->ctm);
// update fill and stroke paints.
@@ -407,7 +404,6 @@ nr_arena_shape_clip(cairo_t *ct, NRArenaItem *item, NRRectL *area)
if (!shape->curve) return item->state;
cairo_save(ct);
- cairo_translate(ct, -area->x0, -area->y0);
ink_cairo_transform(ct, shape->ctm);
feed_pathvector_to_cairo(ct, shape->curve->get_pathvector());
cairo_restore(ct);
diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp
index 148b14f53..eda6eaf8e 100644
--- a/src/display/nr-filter.cpp
+++ b/src/display/nr-filter.cpp
@@ -171,7 +171,7 @@ int Filter::render(NRArenaItem const *item, cairo_t *bgct, NRRectL const *bgarea
}
cairo_surface_t *result = slot.get_result(_output_slot);
- cairo_set_source_surface(graphic, result, 0, 0);
+ cairo_set_source_surface(graphic, result, area->x0, area->y0);
cairo_set_operator(graphic, CAIRO_OPERATOR_SOURCE);
cairo_paint(graphic);
cairo_set_operator(graphic, CAIRO_OPERATOR_OVER);
diff --git a/src/flood-context.cpp b/src/flood-context.cpp
index dab0a33fa..9e78c8d52 100644
--- a/src/flood-context.cpp
+++ b/src/flood-context.cpp
@@ -830,6 +830,7 @@ static void sp_flood_do_flood_fill(SPEventContext *event_context, GdkEvent *even
cairo_surface_t *s = cairo_image_surface_create_for_data(
px, CAIRO_FORMAT_ARGB32, width, height, stride);
cairo_t *ct = cairo_create(s);
+ // cairo_translate not necessary here - surface origin is at 0,0
SPNamedView *nv = sp_desktop_namedview(desktop);
guint32 bgcolor = nv->pagecolor;
diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp
index 20870086a..fe7017d3e 100644
--- a/src/helper/png-write.cpp
+++ b/src/helper/png-write.cpp
@@ -339,6 +339,8 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v
cairo_surface_t *s = cairo_image_surface_create_for_data(
px, CAIRO_FORMAT_ARGB32, ebp->width, num_rows, stride);
cairo_t *ct = cairo_create(s);
+ cairo_translate(ct, -bbox.x0, -bbox.y0);
+
ink_cairo_set_source_rgba32(ct, ebp->background);
cairo_set_operator(ct, CAIRO_OPERATOR_SOURCE);
cairo_paint(ct);
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index e211203d4..2f8c141bf 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -660,6 +660,7 @@ sp_pattern_create_pattern(SPPaintServer *ps,
c[Geom::X], c[Geom::Y]);
cairo_t *ct = cairo_create(temp);
ink_cairo_transform(ct, t);
+ cairo_translate(ct, -x, -y);
// render pattern.
if (needs_opacity) {
diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp
index aead24236..5a03366fc 100644
--- a/src/ui/cache/svg_preview_cache.cpp
+++ b/src/ui/cache/svg_preview_cache.cpp
@@ -68,6 +68,7 @@ GdkPixbuf* render_pixbuf(NRArenaItem* root, double scale_factor, const Geom::Rec
cairo_surface_t *s = cairo_image_surface_create(
CAIRO_FORMAT_ARGB32, psize, psize);
cairo_t *ct = cairo_create(s);
+ cairo_translate(ct, -area.x0, -area.y0);
nr_arena_item_invoke_render(ct, root, &area, NULL,
NR_ARENA_ITEM_RENDER_NO_CACHE );
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index 4ba86b295..d8f451ed7 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -1023,6 +1023,7 @@ sp_icon_doc_icon( SPDocument *doc, NRArenaItem *root,
cairo_surface_t *s = cairo_image_surface_create_for_data(px,
CAIRO_FORMAT_ARGB32, psize, psize, stride);
cairo_t *ct = cairo_create(s);
+ cairo_translate(ct, -ua.x0, -ua.y0);
nr_arena_item_invoke_render(ct, root, &ua, NULL,
NR_ARENA_ITEM_RENDER_NO_CACHE );