diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2014-02-28 10:09:32 +0000 |
|---|---|---|
| committer | tavmjong-free <tavmjong@free.fr> | 2014-02-28 10:09:32 +0000 |
| commit | 2b00f3b9bdfa55829ce5521f3de15b83b14b654a (patch) | |
| tree | df8d56211500d95f496b7a1d1cc0f8c28441e1b0 /src/sp-filter.cpp | |
| parent | Copy event with gdk_event_copy instead of assigning to structure by value. (diff) | |
| download | inkscape-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.cpp | 28 |
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? */ } |
