diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2012-10-15 13:54:17 +0000 |
|---|---|---|
| committer | tavmjong-free <tavmjong@free.fr> | 2012-10-15 13:54:17 +0000 |
| commit | af8254ef0ce34909183a1a2985572c1f96f2d32d (patch) | |
| tree | a944c3838dcfba5d0779f1acac71e7be9d5c4194 /src | |
| parent | Use filter primitive region and aspect ratio in image filter primitive, fixes... (diff) | |
| download | inkscape-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.cpp | 4 | ||||
| -rw-r--r-- | src/display/nr-filter-primitive.cpp | 29 |
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; |
