X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdisplay%2Fnr-filter-units.cpp;h=6836e39af8771ccac3d7ef729f00f58732d9aa47;hb=813d38872d464e1992025f8dc9fa593142b807d9;hp=0cad1b4c1b0fa7c856395f0b3761d34c2a76e007;hpb=1a37ce4a40095c20d83ed6ab3dce34f53bac1b65;p=inkscape.git diff --git a/src/display/nr-filter-units.cpp b/src/display/nr-filter-units.cpp index 0cad1b4c1..6836e39af 100644 --- a/src/display/nr-filter-units.cpp +++ b/src/display/nr-filter-units.cpp @@ -13,6 +13,9 @@ #include "display/nr-filter-units.h" #include "libnr/nr-matrix.h" +#include "libnr/nr-matrix-fns.h" +#include "libnr/nr-matrix-ops.h" +#include "libnr/nr-matrix-scale-ops.h" #include "libnr/nr-rect.h" #include "libnr/nr-rect-l.h" #include "libnr/nr-scale.h" @@ -102,7 +105,7 @@ Matrix FilterUnits::get_matrix_units2pb(SPFilterUnits units) const { } else if (units == SP_FILTER_UNITS_USERSPACEONUSE) { return get_matrix_user2pb(); } else { - g_warning("Error in NR::FilterUnits::get_matrix_units2pb: unrecognized value of filterUnits"); + g_warning("Error in NR::FilterUnits::get_matrix_units2pb: unrecognized unit type (%d)", units); return Matrix(); } } @@ -127,6 +130,33 @@ Matrix FilterUnits::get_matrix_pb2display() const { return pb2d; } +Matrix FilterUnits::get_matrix_user2units(SPFilterUnits units) const { + if (units == SP_FILTER_UNITS_OBJECTBOUNDINGBOX) { + /* No need to worry about rotations: bounding box coordinates + * always have base vectors paraller with userspace coordinates */ + Point min(item_bbox.min()); + Point max(item_bbox.max()); + double scale_x = 1.0 / (max[X] - min[X]); + double scale_y = 1.0 / (max[Y] - min[Y]); + return Matrix(scale_x, 0, + 0, scale_y, + min[X] * scale_x, min[Y] * scale_y); + } else if (units == SP_FILTER_UNITS_USERSPACEONUSE) { + return identity(); + } else { + g_warning("Error in NR::FilterUnits::get_matrix_user2units: unrecognized unit type (%d)", units); + return Matrix(); + } +} + +Matrix FilterUnits::get_matrix_user2filterunits() const { + return get_matrix_user2units(filterUnits); +} + +Matrix FilterUnits::get_matrix_user2primitiveunits() const { + return get_matrix_user2units(primitiveUnits); +} + IRect FilterUnits::get_pixblock_filterarea_paraller() const { int min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN; Matrix u2pb = get_matrix_user2pb();