summaryrefslogtreecommitdiffstats
path: root/src/sp-filter.cpp
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2014-03-01 09:19:51 +0000
committertavmjong-free <tavmjong@free.fr>2014-03-01 09:19:51 +0000
commitc986b61b956280bfd0b24c1dddf758216e6940f8 (patch)
tree29e4674c3858c7a8964dceb294bb34bb68ff5a9d /src/sp-filter.cpp
parentCode cleanup and indentation. (diff)
downloadinkscape-c986b61b956280bfd0b24c1dddf758216e6940f8.tar.gz
inkscape-c986b61b956280bfd0b24c1dddf758216e6940f8.zip
Use viewport when calculating filter primitive region when 'primitiveUnits' set to "userSpaceOnUse".
(bzr r13083)
Diffstat (limited to 'src/sp-filter.cpp')
-rw-r--r--src/sp-filter.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp
index 0e3d2d5ce..e8319baca 100644
--- a/src/sp-filter.cpp
+++ b/src/sp-filter.cpp
@@ -213,7 +213,6 @@ void SPFilter::update(SPCtx *ctx, guint flags) {
// Note: This only works for root viewport since this routine is not called after
// setting a new viewport. A true fix requires a strategy like SPItemView or SPMarkerView.
if(this->filterUnits == SP_FILTER_UNITS_USERSPACEONUSE) {
- std::cout << " userSpaceOnUse" << std::endl;
if (this->x.unit == SVGLength::PERCENT) {
this->x._set = true;
this->x.computed = this->x.value * ictx->viewport.width();
@@ -238,6 +237,25 @@ void SPFilter::update(SPCtx *ctx, guint flags) {
}
+ // Update filter primitives in order to update filter primitive area
+ // (SPObject::ActionUpdate is not actually used)
+ unsigned childflags = flags;
+
+ if (flags & SP_OBJECT_MODIFIED_FLAG) {
+ childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
+ }
+ childflags &= SP_OBJECT_MODIFIED_CASCADE;
+
+ GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate));
+ while (l) {
+ SPObject *child = SP_OBJECT (l->data);
+ l = g_slist_remove (l, child);
+ if( SP_IS_FILTER_PRIMITIVE( child ) ) {
+ child->updateDisplay(ctx, childflags);
+ }
+ sp_object_unref(child);
+ }
+
SPObject::update(ctx, flags);
}