summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2012-10-15 13:54:17 +0000
committertavmjong-free <tavmjong@free.fr>2012-10-15 13:54:17 +0000
commitaf8254ef0ce34909183a1a2985572c1f96f2d32d (patch)
treea944c3838dcfba5d0779f1acac71e7be9d5c4194 /src
parentUse filter primitive region and aspect ratio in image filter primitive, fixes... (diff)
downloadinkscape-af8254ef0ce34909183a1a2985572c1f96f2d32d.tar.gz
inkscape-af8254ef0ce34909183a1a2985572c1f96f2d32d.zip
Better attempt at finding primitive filter region for percent and userSpaceOnUse.
(bzr r11804)
Diffstat (limited to 'src')
-rw-r--r--src/display/nr-filter-image.cpp4
-rw-r--r--src/display/nr-filter-primitive.cpp29
2 files changed, 26 insertions, 7 deletions
diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
index 722a4ed7f..e03a56964 100644
--- a/src/display/nr-filter-image.cpp
+++ b/src/display/nr-filter-image.cpp
@@ -52,8 +52,8 @@ void FilterImage::render_cairo(FilterSlot &slot)
//cairo_surface_t *input = slot.getcairo(_input);
// Viewport is filter primitive area (in user coordinates).
- // Note: viewport calculation in non-trivial. Do not use
- // rely on get_matrix_primitiveunits2pb().
+ // Note: viewport calculation in non-trivial. Do not rely
+ // on get_matrix_primitiveunits2pb().
Geom::Rect vp = filter_primitive_area( slot.get_units() );
double feImageX = vp.min()[Geom::X];
double feImageY = vp.min()[Geom::Y];
diff --git a/src/display/nr-filter-primitive.cpp b/src/display/nr-filter-primitive.cpp
index c6bd8a74e..93c6d4d6e 100644
--- a/src/display/nr-filter-primitive.cpp
+++ b/src/display/nr-filter-primitive.cpp
@@ -15,6 +15,12 @@
#include "display/nr-filter-types.h"
#include "svg/svg-length.h"
+#include "inkscape.h"
+#include "desktop.h"
+#include "desktop-handles.h"
+#include "document.h"
+#include "sp-root.h"
+
namespace Inkscape {
namespace Filters {
@@ -103,6 +109,19 @@ Geom::Rect FilterPrimitive::filter_primitive_area(FilterUnits const &units)
Geom::OptRect bb = units.get_item_bbox();
Geom::OptRect fa = units.get_filter_area();
+ // This is definitely a hack... but what else to do?
+ // Current viewport might not be document viewport... but how to find?
+ SPDesktop* desktop = inkscape_active_desktop();
+ SPDocument* document = sp_desktop_document(desktop);
+ SPRoot* root = document->getRoot();
+ Geom::Rect viewport;
+ if( root->viewBox_set ) {
+ viewport = root->viewBox;
+ } else {
+ // Pick some random values
+ viewport = Geom::Rect::from_xywh(0,0,480,360);
+ }
+
/* Update computed values for ex, em, %. For %, assumes primitive unit is objectBoundingBox. */
/* TODO: fetch somehow the object ex and em lengths; 12, 6 are just dummy values. */
double len_x = bb->width();
@@ -144,11 +163,11 @@ Geom::Rect FilterPrimitive::filter_primitive_area(FilterUnits const &units)
if( _subregion_y._set && _subregion_y.unit != SVGLength::PERCENT ) y = _subregion_y.computed;
if( _subregion_width._set && _subregion_width.unit != SVGLength::PERCENT ) width = _subregion_width.computed;
if( _subregion_height._set && _subregion_height.unit != SVGLength::PERCENT ) height = _subregion_height.computed;
- // TODO: add percent of viewport TEMPORARY HACK FOR TESTING...
- if( _subregion_x._set && _subregion_x.unit == SVGLength::PERCENT ) x = _subregion_x.value * 480; // viewport_x
- if( _subregion_y._set && _subregion_y.unit == SVGLength::PERCENT ) y = _subregion_y.value * 360;
- if( _subregion_width._set && _subregion_width.unit == SVGLength::PERCENT ) width = _subregion_width.value * 480;
- if( _subregion_height._set && _subregion_height.unit == SVGLength::PERCENT ) height = _subregion_height.value * 360;
+ // Percent of viewport
+ if( _subregion_x._set && _subregion_x.unit == SVGLength::PERCENT ) x = _subregion_x.value * viewport.width();
+ if( _subregion_y._set && _subregion_y.unit == SVGLength::PERCENT ) y = _subregion_y.value * viewport.height();
+ if( _subregion_width._set && _subregion_width.unit == SVGLength::PERCENT ) width = _subregion_width.value * viewport.width();
+ if( _subregion_height._set && _subregion_height.unit == SVGLength::PERCENT ) height = _subregion_height.value * viewport.height();
}
Geom::Point minp, maxp;