Code

No more NRMatrix or NRPoint.
[inkscape.git] / src / display / nr-filter-units.cpp
index 2c84800d69c20ab57bb9b9e37aa5ab6a28375924..6836e39af8771ccac3d7ef729f00f58732d9aa47 100644 (file)
 
 #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"
 #include "sp-filter-units.h"
 
@@ -71,8 +75,8 @@ Matrix FilterUnits::get_matrix_user2pb() const {
         u2pb[1] = 0;
         u2pb[2] = 0;
         u2pb[3] = resolution_y / (filter_area.max()[Y] - filter_area.min()[Y]);
-        u2pb[4] = 0;
-        u2pb[5] = 0;
+        u2pb[4] = ctm[4];
+        u2pb[5] = ctm[5];
     }
 
     return u2pb;
@@ -101,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();
     }
 }
@@ -126,6 +130,49 @@ 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();
+
+    for (int i = 0 ; i < 4 ; i++) {
+        Point p = filter_area.corner(i);
+        p *= u2pb;
+        if (p[X] < min_x) min_x = (int)std::floor(p[X]);
+        if (p[X] > max_x) max_x = (int)std::ceil(p[X]);
+        if (p[Y] < min_y) min_y = (int)std::floor(p[Y]);
+        if (p[Y] > max_y) max_y = (int)std::ceil(p[Y]);
+    }
+    IRect ret(IPoint(min_x, min_y), IPoint(max_x, max_y));
+    return ret;
+}
+
 FilterUnits& FilterUnits::operator=(FilterUnits const &other) {
     filterUnits = other.filterUnits;
     primitiveUnits = other.primitiveUnits;