index 61f9970f1b2d0072d374283882cf78db62fe7fcf..1d73f14e1906ec92ff560d18bba0d8fec95cdc8a 100644 (file)
#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 {
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
+ bool free_in_on_exit = false;
+ 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,
+ true);
+ nr_blit_pixblock_pixblock(in, original_in);
+ free_in_on_exit = true;
+ }
+
unsigned char *in_data = NR_PIXBLOCK_PX(in);
unsigned char *out_data = NR_PIXBLOCK_PX(out);
unsigned char r,g,b,a;
@@ -130,6 +145,12 @@ int FilterColorMatrix::render(FilterSlot &slot, FilterUnits const &/*units*/) {
case COLORMATRIX_ENDTYPE:
break;
}
+
+ if (free_in_on_exit) {
+ nr_pixblock_release(in);
+ delete in;
+ }
+
out->empty = FALSE;
slot.set(_output, out);
return 0;