summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNiko Kiirala <niko@kiirala.com>2009-05-29 07:25:08 +0000
committerkiirala <kiirala@users.sourceforge.net>2009-05-29 07:25:08 +0000
commitc38fddedd6907d291a8296da56f02f2520ba2a39 (patch)
treef38134366eb0149c170eb387f86dbd5e321f37a4 /src
parentWindows cleanups. Fixes bug #381374. (diff)
downloadinkscape-c38fddedd6907d291a8296da56f02f2520ba2a39.tar.gz
inkscape-c38fddedd6907d291a8296da56f02f2520ba2a39.zip
Fixed area_enlarge in couple filters, to prevent white lines in rendering
(bzr r7961)
Diffstat (limited to 'src')
-rw-r--r--src/display/nr-filter-diffuselighting.cpp13
-rw-r--r--src/display/nr-filter-diffuselighting.h1
-rw-r--r--src/display/nr-filter-morphology.cpp5
-rw-r--r--src/display/nr-filter-specularlighting.cpp13
-rw-r--r--src/display/nr-filter-specularlighting.h1
5 files changed, 31 insertions, 2 deletions
diff --git a/src/display/nr-filter-diffuselighting.cpp b/src/display/nr-filter-diffuselighting.cpp
index 8915c88b1..0fe4c5947 100644
--- a/src/display/nr-filter-diffuselighting.cpp
+++ b/src/display/nr-filter-diffuselighting.cpp
@@ -168,6 +168,19 @@ int FilterDiffuseLighting::render(FilterSlot &slot, FilterUnits const &units) {
return 0;
}
+void FilterDiffuseLighting::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+{
+ // TODO: support kernelUnitLength
+ double scalex = std::fabs(trans[0]) + std::fabs(trans[1]);
+ double scaley = std::fabs(trans[2]) + std::fabs(trans[3]);
+
+ //FIXME: no +2 should be there!... (noticable only for big scales at big zoom factor)
+ area.x0 -= (int)(scalex) + 2;
+ area.x1 += (int)(scalex) + 2;
+ area.y0 -= (int)(scaley) + 2;
+ area.y1 += (int)(scaley) + 2;
+}
+
FilterTraits FilterDiffuseLighting::get_input_traits() {
return TRAIT_PARALLER;
}
diff --git a/src/display/nr-filter-diffuselighting.h b/src/display/nr-filter-diffuselighting.h
index a1c6964cb..708c7a0a2 100644
--- a/src/display/nr-filter-diffuselighting.h
+++ b/src/display/nr-filter-diffuselighting.h
@@ -42,6 +42,7 @@ public:
static FilterPrimitive *create();
virtual ~FilterDiffuseLighting();
virtual int render(FilterSlot &slot, FilterUnits const &units);
+ virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
virtual FilterTraits get_input_traits();
private:
diff --git a/src/display/nr-filter-morphology.cpp b/src/display/nr-filter-morphology.cpp
index fb51099d5..2df3ff807 100644
--- a/src/display/nr-filter-morphology.cpp
+++ b/src/display/nr-filter-morphology.cpp
@@ -9,6 +9,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cmath>
#include "display/nr-filter-morphology.h"
#include "display/nr-filter-units.h"
#include "libnr/nr-blit.h"
@@ -113,8 +114,8 @@ int FilterMorphology::render(FilterSlot &slot, FilterUnits const &units) {
void FilterMorphology::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
{
- int const enlarge_x = (int)round(this->xradius * trans.expansionX());
- int const enlarge_y = (int)round(this->yradius * trans.expansionY());
+ int const enlarge_x = (int)std::ceil(this->xradius * (std::fabs(trans[0]) + std::fabs(trans[1])));
+ int const enlarge_y = (int)std::ceil(this->yradius * (std::fabs(trans[2]) + std::fabs(trans[3])));
area.x0 -= enlarge_x;
area.x1 += enlarge_x;
diff --git a/src/display/nr-filter-specularlighting.cpp b/src/display/nr-filter-specularlighting.cpp
index b096ee49d..6a6ce38a8 100644
--- a/src/display/nr-filter-specularlighting.cpp
+++ b/src/display/nr-filter-specularlighting.cpp
@@ -188,6 +188,19 @@ int FilterSpecularLighting::render(FilterSlot &slot, FilterUnits const &units) {
return 0;
}
+void FilterSpecularLighting::area_enlarge(NRRectL &area, Geom::Matrix const &trans)
+{
+ // TODO: support kernelUnitLength
+ double scalex = std::fabs(trans[0]) + std::fabs(trans[1]);
+ double scaley = std::fabs(trans[2]) + std::fabs(trans[3]);
+
+ //FIXME: no +2 should be there!... (noticable only for big scales at big zoom factor)
+ area.x0 -= (int)(scalex) + 2;
+ area.x1 += (int)(scalex) + 2;
+ area.y0 -= (int)(scaley) + 2;
+ area.y1 += (int)(scaley) + 2;
+}
+
FilterTraits FilterSpecularLighting::get_input_traits() {
return TRAIT_PARALLER;
}
diff --git a/src/display/nr-filter-specularlighting.h b/src/display/nr-filter-specularlighting.h
index e141f8f1f..0f9e6dfe9 100644
--- a/src/display/nr-filter-specularlighting.h
+++ b/src/display/nr-filter-specularlighting.h
@@ -43,6 +43,7 @@ public:
static FilterPrimitive *create();
virtual ~FilterSpecularLighting();
virtual int render(FilterSlot &slot, FilterUnits const &units);
+ virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans);
virtual FilterTraits get_input_traits();
private: