From 9ae23d42ab800ee4da98dc3abe083fd6770a718b Mon Sep 17 00:00:00 2001 From: kiirala Date: Fri, 29 May 2009 07:25:08 +0000 Subject: [PATCH] Fixed area_enlarge in couple filters, to prevent white lines in rendering --- src/display/nr-filter-diffuselighting.cpp | 13 +++++++++++++ src/display/nr-filter-diffuselighting.h | 1 + src/display/nr-filter-morphology.cpp | 5 +++-- src/display/nr-filter-specularlighting.cpp | 13 +++++++++++++ src/display/nr-filter-specularlighting.h | 1 + 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 #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: -- 2.39.5