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/display | |
| 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/display')
| -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 |
6 files changed, 18 insertions, 27 deletions
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); |
