index d98bbaf3ab580a68bc44a55778d799efeacdf1e3..195dba2f073c530a70c66f3220a291f48112ada1 100644 (file)
#define noNR_ARENA_ITEM_VERBOSE
#define noNR_ARENA_ITEM_DEBUG_CASCADE
#define noNR_ARENA_ITEM_VERBOSE
#define noNR_ARENA_ITEM_DEBUG_CASCADE
+#include <cstring>
+#include <string>
#include <libnr/nr-blit.h>
#include <libnr/nr-pixops.h>
#include <libnr/nr-blit.h>
#include <libnr/nr-pixops.h>
+#include <libnr/nr-matrix-ops.h>
+#include <libnr/nr-matrix-fns.h>
#include "nr-arena.h"
#include "nr-arena-item.h"
#include "gc-core.h"
#include "nr-arena.h"
#include "nr-arena-item.h"
#include "gc-core.h"
unsigned int state, unsigned int reset)
{
NRGC childgc (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),
nr_return_val_if_fail (item != NULL, NR_ARENA_ITEM_STATE_INVALID);
nr_return_val_if_fail (NR_IS_ARENA_ITEM (item),
/* Set up local gc */
childgc = *gc;
if (item->transform) {
/* 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;
}
/* Remember the transformation matrix */
item->ctm = childgc.transform;
if (item->state & NR_ARENA_ITEM_STATE_INVALID)
return item->state;
/* Enlarge the bounding box to contain filter effects */
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
item->filter->bbox_enlarge (item->bbox);
}
// fixme: to fix the display glitches, in outline mode bbox must be a combination of
nr_arena_item_invoke_render (cairo_t *ct, NRArenaItem *item, NRRectL const *area,
NRPixBlock *pb, unsigned int flags)
{
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),
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;
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);
}
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;
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)
/* 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 */
|| (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;
}
(item->parent && item->parent->background_pb)) {
item->background_pb = &ipb;
}
+
ipb.visible_area = pb->visible_area;
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 */
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 */
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);
}
item->filter->render (item, &ipb);
}
void
nr_arena_item_set_transform (NRArenaItem *item, NR::Matrix const &transform)
{
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 (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));
{
nr_return_if_fail (item != NULL);
nr_return_if_fail (NR_IS_ARENA_ITEM (item));
if (!transform && !item->transform)
return;
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);
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)
/* 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);
*item->transform = *transform;
}
nr_arena_item_request_update (item, NR_ARENA_ITEM_STATE_ALL, TRUE);
nr_arena_item_set_child_position (item->parent, item, ref);
}
nr_arena_item_set_child_position (item->parent, item, ref);
}
+void
+nr_arena_item_set_item_bbox (NRArenaItem *item, NR::Maybe<NR::Rect> &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)
/** Returns a background image for use with filter effects. */
NRPixBlock *
nr_arena_item_get_background (NRArenaItem const *item, int depth)