From: jucablues Date: Thu, 21 Feb 2008 09:59:35 +0000 (+0000) Subject: fix for bug #193838 (colormatrix uses premultiplied alpha) X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=73888cfbebd0bf1b7114fd0131ec49243f8c64e0;p=inkscape.git fix for bug #193838 (colormatrix uses premultiplied alpha) --- diff --git a/src/display/nr-filter-colormatrix.cpp b/src/display/nr-filter-colormatrix.cpp index 61f9970f1..51017ab02 100644 --- a/src/display/nr-filter-colormatrix.cpp +++ b/src/display/nr-filter-colormatrix.cpp @@ -12,6 +12,7 @@ #include "display/nr-filter-colormatrix.h" #include "display/nr-filter-units.h" #include "display/nr-filter-utils.h" +#include "libnr/nr-blit.h" #include namespace NR { @@ -36,10 +37,22 @@ int FilterColorMatrix::render(FilterSlot &slot, FilterUnits const &/*units*/) { NRPixBlock *out = new NRPixBlock; - nr_pixblock_setup_fast(out, in->mode, + nr_pixblock_setup_fast(out, NR_PIXBLOCK_MODE_R8G8B8A8N, in->area.x0, in->area.y0, in->area.x1, in->area.y1, true); + // this primitive is defined for non-premultiplied RGBA values, + // thus convert them to that format before blending + if (in->mode != NR_PIXBLOCK_MODE_R8G8B8A8N) { + NRPixBlock *original_in = in; + in = new NRPixBlock; + nr_pixblock_setup_fast(in, NR_PIXBLOCK_MODE_R8G8B8A8N, + original_in->area.x0, original_in->area.y0, + original_in->area.x1, original_in->area.y1, + false); + nr_blit_pixblock_pixblock(in, original_in); + } + unsigned char *in_data = NR_PIXBLOCK_PX(in); unsigned char *out_data = NR_PIXBLOCK_PX(out); unsigned char r,g,b,a;