X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdisplay%2Fnr-arena-item.cpp;h=195dba2f073c530a70c66f3220a291f48112ada1;hb=61a8e3bd39889c3795adbfdf368c7a40e46292a5;hp=d98bbaf3ab580a68bc44a55778d799efeacdf1e3;hpb=695303a5474c1026b5611e86909ff840efb9ee3c;p=inkscape.git diff --git a/src/display/nr-arena-item.cpp b/src/display/nr-arena-item.cpp index d98bbaf3a..195dba2f0 100644 --- a/src/display/nr-arena-item.cpp +++ b/src/display/nr-arena-item.cpp @@ -15,9 +15,13 @@ #define noNR_ARENA_ITEM_VERBOSE #define noNR_ARENA_ITEM_DEBUG_CASCADE +#include +#include #include #include +#include +#include #include "nr-arena.h" #include "nr-arena-item.h" #include "gc-core.h" @@ -203,6 +207,7 @@ nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigned int state, unsigned int reset) { NRGC childgc (gc); + bool filter = (item->arena->rendermode == Inkscape::RENDERMODE_NORMAL); nr_return_val_if_fail (item != NULL, NR_ARENA_ITEM_STATE_INVALID); nr_return_val_if_fail (NR_IS_ARENA_ITEM (item), @@ -243,8 +248,7 @@ nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, /* Set up local gc */ childgc = *gc; if (item->transform) { - nr_matrix_multiply (&childgc.transform, item->transform, - &childgc.transform); + childgc.transform = (*item->transform) * childgc.transform; } /* Remember the transformation matrix */ item->ctm = childgc.transform; @@ -256,7 +260,7 @@ nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, if (item->state & NR_ARENA_ITEM_STATE_INVALID) return item->state; /* Enlarge the bounding box to contain filter effects */ - if (item->filter) { + if (item->filter && filter) { item->filter->bbox_enlarge (item->bbox); } // fixme: to fix the display glitches, in outline mode bbox must be a combination of @@ -297,7 +301,8 @@ unsigned int nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area, NRPixBlock *pb, unsigned int flags) { - bool outline = (item->arena->rendermode == RENDERMODE_OUTLINE); + bool outline = (item->arena->rendermode == Inkscape::RENDERMODE_OUTLINE); + bool filter = (item->arena->rendermode == Inkscape::RENDERMODE_NORMAL); nr_return_val_if_fail (item != NULL, NR_ARENA_ITEM_STATE_INVALID); nr_return_val_if_fail (NR_IS_ARENA_ITEM (item), @@ -318,7 +323,7 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area nr_rect_l_intersect (&carea, area, &item->bbox); if (nr_rect_l_test_empty (&carea)) return item->state | NR_ARENA_ITEM_STATE_RENDER; - if (item->filter && !outline) { + if (item->filter && filter) { item->filter->area_enlarge (carea, item->ctm); nr_rect_l_intersect (&carea, &carea, &item->bbox); } @@ -392,12 +397,12 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area dpb = &cpb; // Set nocache flag for downstream rendering flags |= NR_ARENA_ITEM_RENDER_NO_CACHE; - } + } /* Determine, whether we need temporary buffer */ if (item->clip || item->mask || ((item->opacity != 255) && !item->render_opacity) - || (item->filter) || item->background_new + || (item->filter && filter) || item->background_new || (item->parent && item->parent->background_pb)) { /* Setup and render item buffer */ @@ -418,7 +423,12 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area (item->parent && item->parent->background_pb)) { item->background_pb = &ipb; } + ipb.visible_area = pb->visible_area; + if (item->filter && filter) { + item->filter->area_enlarge (ipb.visible_area, item->ctm); + } + unsigned int state = NR_ARENA_ITEM_VIRTUAL (item, render) (ct, item, &carea, &ipb, flags); if (state & NR_ARENA_ITEM_STATE_INVALID) { /* Clean up and return error */ @@ -431,7 +441,7 @@ nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area ipb.empty = FALSE; /* Run filtering, if a filter is set for this object */ - if (item->filter) { + if (item->filter && filter) { item->filter->render (item, &ipb); } @@ -703,12 +713,12 @@ nr_arena_item_append_child (NRArenaItem *parent, NRArenaItem *child) void nr_arena_item_set_transform (NRArenaItem *item, NR::Matrix const &transform) { - NRMatrix const t (transform); + NR::Matrix const t (transform); nr_arena_item_set_transform (item, &t); } void -nr_arena_item_set_transform (NRArenaItem *item, NRMatrix const *transform) +nr_arena_item_set_transform (NRArenaItem *item, NR::Matrix const *transform) { nr_return_if_fail (item != NULL); nr_return_if_fail (NR_IS_ARENA_ITEM (item)); @@ -716,17 +726,17 @@ nr_arena_item_set_transform (NRArenaItem *item, NRMatrix const *transform) if (!transform && !item->transform) return; - const NRMatrix *md = (item->transform) ? item->transform : &NR_MATRIX_IDENTITY; - const NRMatrix *ms = (transform) ? transform : &NR_MATRIX_IDENTITY; + const NR::Matrix *md = (item->transform) ? item->transform : &NR_MATRIX_IDENTITY; + const NR::Matrix *ms = (transform) ? transform : &NR_MATRIX_IDENTITY; - if (!NR_MATRIX_DF_TEST_CLOSE (md, ms, NR_EPSILON)) { + if (!NR::matrix_equalp(*md, *ms, NR_EPSILON)) { nr_arena_item_request_render (item); - if (!transform || nr_matrix_test_identity (transform, NR_EPSILON)) { + if (!transform || transform->test_identity()) { /* Set to identity affine */ item->transform = NULL; } else { if (!item->transform) - item->transform = new (GC::ATOMIC) NRMatrix (); + item->transform = new (GC::ATOMIC) NR::Matrix (); *item->transform = *transform; } nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, TRUE); @@ -825,6 +835,15 @@ nr_arena_item_set_order (NRArenaItem *item, int order) nr_arena_item_set_child_position (item->parent, item, ref); } +void +nr_arena_item_set_item_bbox (NRArenaItem *item, NR::Maybe &bbox) +{ + nr_return_if_fail(item != NULL); + nr_return_if_fail(NR_IS_ARENA_ITEM(item)); + + item->item_bbox = bbox; +} + /** Returns a background image for use with filter effects. */ NRPixBlock * nr_arena_item_get_background (NRArenaItem const *item, int depth)