Code

No more NRMatrix or NRPoint.
[inkscape.git] / src / display / nr-filter-gaussian.cpp
index fdab94f1d7c82ba284fe2cfceb141cf088743fdd..5ef43039475e1570cb7c745693270805e98d3d79 100644 (file)
@@ -17,6 +17,7 @@
 #include <cmath>
 #include <complex>
 #include <glib.h>
+#include <cstdlib>
 #include <limits>
 
 #include "isnan.h"
@@ -27,6 +28,7 @@
 #include "display/nr-filter-units.h"
 #include "libnr/nr-pixblock.h"
 #include "libnr/nr-matrix.h"
+#include "libnr/nr-matrix-fns.h"
 #include "util/fixed_point.h"
 #include "prefs-utils.h"
 
@@ -508,9 +510,14 @@ upsample(PT *const dst, int const dstr1, int const dstr2, unsigned int const dn1
 
 int FilterGaussian::render(FilterSlot &slot, FilterUnits const &units)
 {
-    Matrix trans = units.get_matrix_primitiveunits2pb();
     /* in holds the input pixblock */
     NRPixBlock *in = slot.get(_input);
+    if (!in) {
+        g_warning("Missing source image for feGaussianBlur (in=%d)", _input);
+        return 1;
+    }
+
+    Matrix trans = units.get_matrix_primitiveunits2pb();
 
     /* If to either direction, the standard deviation is zero or
      * input image is not defined,
@@ -533,8 +540,8 @@ int FilterGaussian::render(FilterSlot &slot, FilterUnits const &units)
 
     // Some common constants
     int const width_org = in->area.x1-in->area.x0, height_org = in->area.y1-in->area.y0;
-    double const deviation_x_org = _deviation_x * trans.expansionX();
-    double const deviation_y_org = _deviation_y * trans.expansionY();
+    double const deviation_x_org = _deviation_x * NR::expansionX(trans);
+    double const deviation_y_org = _deviation_y * NR::expansionY(trans);
     int const PC = NR_PIXBLOCK_BPP(in);
 
     // Subsampling constants
@@ -768,8 +775,8 @@ int FilterGaussian::render(FilterSlot &slot, FilterUnits const &units)
 
 void FilterGaussian::area_enlarge(NRRectL &area, Matrix const &trans)
 {
-    int area_x = _effect_area_scr(_deviation_x * trans.expansionX());
-    int area_y = _effect_area_scr(_deviation_y * trans.expansionY());
+    int area_x = _effect_area_scr(_deviation_x * NR::expansionX(trans));
+    int area_y = _effect_area_scr(_deviation_y * NR::expansionY(trans));
     // maximum is used because rotations can mix up these directions
     // TODO: calculate a more tight-fitting rendering area
     int area_max = std::max(area_x, area_y);