summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFelipe Corr??a da Silva Sanches <juca@members.fsf.org>2008-02-21 09:59:35 +0000
committerjucablues <jucablues@users.sourceforge.net>2008-02-21 09:59:35 +0000
commit34211d295267e0ce8b2d78bdaf7d90237fc3e431 (patch)
tree7058b548a7d83642646d5ad0f704a0bab8b27d4e /src
parentdefault values for checkbutton, colorbutton, dualspinbutton, spinslider attrW... (diff)
downloadinkscape-34211d295267e0ce8b2d78bdaf7d90237fc3e431.tar.gz
inkscape-34211d295267e0ce8b2d78bdaf7d90237fc3e431.zip
fix for bug #193838 (colormatrix uses premultiplied alpha)
(bzr r4803)
Diffstat (limited to 'src')
-rw-r--r--src/display/nr-filter-colormatrix.cpp15
1 files changed, 14 insertions, 1 deletions
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 <math.h>
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;