diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-08-15 01:19:33 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-08-15 01:19:33 +0000 |
| commit | 2f3d79db2fad212c8aa1bff7bb13132a34541aff (patch) | |
| tree | ec16b5e4cdd3d69dd6a0ee35b48e0379b679d4f2 /src | |
| parent | Completely remove NRPixBlock (diff) | |
| download | inkscape-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.cpp | 1 | ||||
| -rw-r--r-- | src/display/canvas-arena.cpp | 5 | ||||
| -rw-r--r-- | src/display/nr-arena-glyphs.cpp | 10 | ||||
| -rw-r--r-- | src/display/nr-arena-image.cpp | 1 | ||||
| -rw-r--r-- | src/display/nr-arena-item.cpp | 11 | ||||
| -rw-r--r-- | src/display/nr-arena-shape.cpp | 16 | ||||
| -rw-r--r-- | src/display/nr-filter.cpp | 2 | ||||
| -rw-r--r-- | src/flood-context.cpp | 1 | ||||
| -rw-r--r-- | src/helper/png-write.cpp | 2 | ||||
| -rw-r--r-- | src/sp-pattern.cpp | 1 | ||||
| -rw-r--r-- | src/ui/cache/svg_preview_cache.cpp | 1 | ||||
| -rw-r--r-- | src/widgets/icon.cpp | 1 |
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 ); |
