summaryrefslogtreecommitdiffstats
path: root/src/display/nr-arena-item.cpp
diff options
context:
space:
mode:
authorNiko Kiirala <niko@kiirala.com>2006-06-21 16:04:22 +0000
committerkiirala <kiirala@users.sourceforge.net>2006-06-21 16:04:22 +0000
commitd331e75a28fc513289d24bc0dc10ef7be26da888 (patch)
tree2b9cae58f7256a2e12625068a54299911859e63e /src/display/nr-arena-item.cpp
parentit seems we don't have "required" anymore (diff)
downloadinkscape-d331e75a28fc513289d24bc0dc10ef7be26da888.tar.gz
inkscape-d331e75a28fc513289d24bc0dc10ef7be26da888.zip
svg-filters branch merged back to head
(bzr r1252)
Diffstat (limited to 'src/display/nr-arena-item.cpp')
-rw-r--r--src/display/nr-arena-item.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/display/nr-arena-item.cpp b/src/display/nr-arena-item.cpp
index 97c769548..57413ef22 100644
--- a/src/display/nr-arena-item.cpp
+++ b/src/display/nr-arena-item.cpp
@@ -20,9 +20,12 @@
#include <libnr/nr-pixops.h>
#include "nr-arena.h"
#include "nr-arena-item.h"
-//#include "nr-arena-group.h"
#include "gc-core.h"
+#include "nr-filter.h"
+#include "libnr/nr-rect.h"
+#include "nr-arena-group.h"
+
namespace GC = Inkscape::GC;
static void nr_arena_item_class_init (NRArenaItemClass *klass);
@@ -93,6 +96,7 @@ nr_arena_item_init (NRArenaItem *item)
item->mask = NULL;
item->px = NULL;
item->data = NULL;
+ item->filter = NULL;
}
static void
@@ -243,10 +247,17 @@ nr_arena_item_invoke_update (NRArenaItem *item, NRRectL *area, NRGC *gc, unsigne
if (item->transform) {
nr_matrix_multiply (&childgc.transform, item->transform, &childgc.transform);
}
+ /* Remember the transformation matrix */
+ item->ctm = childgc.transform;
/* Invoke the real method */
item->state = NR_ARENA_ITEM_VIRTUAL (item, update) (item, area, &childgc, state, reset);
if (item->state & NR_ARENA_ITEM_STATE_INVALID) return item->state;
+ /* Enlarge the bounding box to contain filter effects */
+ if(item->filter) {
+ item->filter->bbox_enlarge(item->bbox);
+ }
+
/* Clipping */
if (item->clip) {
unsigned int newstate;
@@ -300,6 +311,10 @@ unsigned int nr_arena_item_invoke_render(NRArenaItem *item, NRRectL const *area,
if (!item->visible) return item->state | NR_ARENA_ITEM_STATE_RENDER;
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) {
+ nr_rect_l_enlarge(&carea, item->filter->get_enlarge(item->ctm));
+ nr_rect_l_intersect(&carea, &carea, &item->bbox);
+ }
if (item->px) {
/* Has cache pixblock, render this and return */
@@ -537,7 +552,7 @@ unsigned int nr_arena_item_invoke_render(NRArenaItem *item, NRRectL const *area,
#endif
} else {
/* Determine, whether we need temporary buffer */
- if (item->clip || item->mask || ((item->opacity != 255) && !item->render_opacity && item->arena->rendermode != RENDERMODE_OUTLINE)) {
+ if (item->clip || item->mask || ((item->opacity != 255) && !item->render_opacity && item->arena->rendermode != RENDERMODE_OUTLINE) || item->filter) {
NRPixBlock ipb, mpb;
/* Setup and render item buffer */
@@ -553,6 +568,11 @@ unsigned int nr_arena_item_invoke_render(NRArenaItem *item, NRRectL const *area,
}
ipb.empty = FALSE;
+ /* Run filtering test, if a filter is set for this object */
+ if(item->filter) {
+ item->filter->render(item, &ipb);
+ }
+
if (item->clip || item->mask) {
/* Setup mask pixblock */
nr_pixblock_setup_fast (&mpb, NR_PIXBLOCK_MODE_A8, carea.x0, carea.y0, carea.x1, carea.y1, TRUE);