summaryrefslogtreecommitdiffstats
path: root/src/sp-filter.cpp
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2014-02-28 10:09:32 +0000
committertavmjong-free <tavmjong@free.fr>2014-02-28 10:09:32 +0000
commit2b00f3b9bdfa55829ce5521f3de15b83b14b654a (patch)
treedf8d56211500d95f496b7a1d1cc0f8c28441e1b0 /src/sp-filter.cpp
parentCopy event with gdk_event_copy instead of assigning to structure by value. (diff)
downloadinkscape-2b00f3b9bdfa55829ce5521f3de15b83b14b654a.tar.gz
inkscape-2b00f3b9bdfa55829ce5521f3de15b83b14b654a.zip
Use viewport when calculating filter region when filterUnits set to "userSpaceOnUse", fixes #229246.
(bzr r13073)
Diffstat (limited to 'src/sp-filter.cpp')
-rw-r--r--src/sp-filter.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp
index c3e7d217e..0e3d2d5ce 100644
--- a/src/sp-filter.cpp
+++ b/src/sp-filter.cpp
@@ -28,6 +28,7 @@ using std::pair;
#include "sp-filter.h"
#include "sp-filter-reference.h"
#include "sp-filter-primitive.h"
+#include "sp-item.h"
#include "uri.h"
#include "xml/repr.h"
#include <cstring>
@@ -206,6 +207,33 @@ void SPFilter::update(SPCtx *ctx, guint flags) {
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
+ SPItemCtx *ictx = (SPItemCtx *) ctx;
+
+ // Do here since we know viewport (Bounding box case handled during rendering)
+ // 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();
+ }
+
+ if (this->y.unit == SVGLength::PERCENT) {
+ this->y._set = true;
+ this->y.computed = this->y.value * ictx->viewport.height();
+ }
+
+ if (this->width.unit == SVGLength::PERCENT) {
+ this->width._set = true;
+ this->width.computed = this->width.value * ictx->viewport.width();
+ }
+
+ if (this->height.unit == SVGLength::PERCENT) {
+ this->height._set = true;
+ this->height.computed = this->height.value * ictx->viewport.height();
+ }
+ }
/* do something to trigger redisplay, updates? */
}