From 065ad4f1dca9404e8f66c6a6224dad918e57807c Mon Sep 17 00:00:00 2001 From: David Capello Date: Tue, 3 May 2016 17:00:50 -0300 Subject: [PATCH] Fix blur ink: avoid adding dark pixels when opacity < 255 (fix #708) --- src/app/tools/ink_processing.h | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/app/tools/ink_processing.h b/src/app/tools/ink_processing.h index cdd96d920..1dfecdd39 100644 --- a/src/app/tools/ink_processing.h +++ b/src/app/tools/ink_processing.h @@ -365,13 +365,10 @@ public: m_area.b /= m_area.count; m_area.a /= 9; - RgbTraits::pixel_t c = *m_srcAddress; - m_area.r = rgba_getr(c) + (m_area.r-rgba_getr(c)) * m_opacity / 255; - m_area.g = rgba_getg(c) + (m_area.g-rgba_getg(c)) * m_opacity / 255; - m_area.b = rgba_getb(c) + (m_area.b-rgba_getb(c)) * m_opacity / 255; - m_area.a = rgba_geta(c) + (m_area.a-rgba_geta(c)) * m_opacity / 255; - - *m_dstAddress = rgba(m_area.r, m_area.g, m_area.b, m_area.a); + *m_dstAddress = + rgba_blender_normal(*m_srcAddress, + rgba(m_area.r, m_area.g, m_area.b, m_area.a), + m_opacity); } else { *m_dstAddress = *m_srcAddress; @@ -419,11 +416,10 @@ public: m_area.v /= m_area.count; m_area.a /= 9; - GrayscaleTraits::pixel_t c = *m_srcAddress; - m_area.v = graya_getv(c) + (m_area.v-graya_getv(c)) * m_opacity / 255; - m_area.a = graya_geta(c) + (m_area.a-graya_geta(c)) * m_opacity / 255; - - *m_dstAddress = graya(m_area.v, m_area.a); + *m_dstAddress = + graya_blender_normal(*m_srcAddress, + graya(m_area.v, m_area.a), + m_opacity); } else { *m_dstAddress = *m_srcAddress; @@ -475,13 +471,13 @@ public: m_area.b /= m_area.count; m_area.a /= 9; - uint32_t color32 = m_palette->getEntry(*m_srcAddress); - m_area.r = rgba_getr(color32) + (m_area.r-rgba_getr(color32)) * m_opacity / 255; - m_area.g = rgba_getg(color32) + (m_area.g-rgba_getg(color32)) * m_opacity / 255; - m_area.b = rgba_getb(color32) + (m_area.b-rgba_getb(color32)) * m_opacity / 255; - m_area.a = rgba_geta(color32) + (m_area.a-rgba_geta(color32)) * m_opacity / 255; + color_t c = + rgba_blender_normal(m_palette->getEntry(*m_srcAddress), + rgba(m_area.r, m_area.g, m_area.b, m_area.a), + m_opacity); - *m_dstAddress = m_rgbmap->mapColor(m_area.r, m_area.g, m_area.b, m_area.a); + *m_dstAddress = m_rgbmap->mapColor( + rgba_getr(c), rgba_getg(c), rgba_getb(c), rgba_geta(c)); } else { *m_dstAddress = *m_srcAddress;