summaryrefslogtreecommitdiffstats
path: root/src/libnr/nr-pixblock-pixel.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/libnr/nr-pixblock-pixel.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/libnr/nr-pixblock-pixel.cpp')
-rw-r--r--src/libnr/nr-pixblock-pixel.cpp230
1 files changed, 230 insertions, 0 deletions
diff --git a/src/libnr/nr-pixblock-pixel.cpp b/src/libnr/nr-pixblock-pixel.cpp
new file mode 100644
index 000000000..c778c0c7f
--- /dev/null
+++ b/src/libnr/nr-pixblock-pixel.cpp
@@ -0,0 +1,230 @@
+#define __NR_PIXBLOCK_PIXEL_C__
+
+/*
+ * Pixel buffer rendering library
+ *
+ * Authors:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ *
+ * This code is in public domain
+ */
+
+#include "nr-pixops.h"
+#include "nr-pixblock-pixel.h"
+
+void
+nr_compose_pixblock_pixblock_pixel (NRPixBlock *dpb, unsigned char *d, const NRPixBlock *spb, const unsigned char *s)
+{
+ if (spb->empty) return;
+
+ if (dpb->empty) {
+ /* Empty destination */
+ switch (dpb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = 255;
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = s[3];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = s[3];
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = NR_COMPOSEN11 (s[0], s[3], 255);
+ d[1] = NR_COMPOSEN11 (s[1], s[3], 255);
+ d[2] = NR_COMPOSEN11 (s[2], s[3], 255);
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = NR_COMPOSEP11 (s[0], s[3], 255);
+ d[1] = NR_COMPOSEP11 (s[1], s[3], 255);
+ d[2] = NR_COMPOSEP11 (s[2], s[3], 255);
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ d[3] = 255;
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ d[3] = s[3];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ if (s[3] == 0) {
+ d[0] = 255;
+ d[1] = 255;
+ d[2] = 255;
+ } else {
+ d[0] = (s[0] * 255) / s[3];
+ d[1] = (s[1] * 255) / s[3];
+ d[2] = (s[2] * 255) / s[3];
+ }
+ d[3] = s[3];
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ d[3] = 255;
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = NR_PREMUL (s[0], s[3]);
+ d[1] = NR_PREMUL (s[1], s[3]);
+ d[2] = NR_PREMUL (s[2], s[3]);
+ d[3] = s[3];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ d[3] = s[3];
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ /* Image destination */
+ switch (dpb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = 255;
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = NR_A7_NORMALIZED(s[3],d[0]);
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = NR_A7_NORMALIZED(s[3],d[0]);
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = NR_COMPOSEN11 (s[0], s[3], d[0]);
+ d[1] = NR_COMPOSEN11 (s[1], s[3], d[1]);
+ d[2] = NR_COMPOSEN11 (s[2], s[3], d[2]);
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = NR_COMPOSEP11 (s[0], s[3], d[0]);
+ d[1] = NR_COMPOSEP11 (s[1], s[3], d[1]);
+ d[2] = NR_COMPOSEP11 (s[2], s[3], d[2]);
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ if (s[3] != 0) {
+ unsigned int ca;
+ ca = NR_A7 (s[3], d[3]);
+ d[0] = NR_COMPOSENNN_A7 (s[0], s[3], d[0], d[3], ca);
+ d[1] = NR_COMPOSENNN_A7 (s[1], s[3], d[1], d[3], ca);
+ d[2] = NR_COMPOSENNN_A7 (s[2], s[3], d[2], d[3], ca);
+ d[3] = (ca + 127) / 255;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ if (s[3] != 0) {
+ unsigned int ca;
+ ca = NR_A7 (s[3], d[3]);
+ d[0] = NR_COMPOSEPNN_A7 (s[0], s[3], d[0], d[3], ca);
+ d[1] = NR_COMPOSEPNN_A7 (s[1], s[3], d[0], d[3], ca);
+ d[2] = NR_COMPOSEPNN_A7 (s[2], s[3], d[0], d[3], ca);
+ d[3] = (ca + 127) / 255;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ switch (spb->mode) {
+ case NR_PIXBLOCK_MODE_A8:
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8:
+ d[0] = s[0];
+ d[1] = s[1];
+ d[2] = s[2];
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8N:
+ d[0] = NR_COMPOSENPP (s[0], s[3], d[0], d[3]);
+ d[1] = NR_COMPOSENPP (s[1], s[3], d[1], d[3]);
+ d[2] = NR_COMPOSENPP (s[2], s[3], d[2], d[3]);
+ d[3] = NR_A7_NORMALIZED(s[3],d[3]);
+ break;
+ case NR_PIXBLOCK_MODE_R8G8B8A8P:
+ d[0] = NR_COMPOSEPPP (s[0], s[3], d[0], d[3]);
+ d[1] = NR_COMPOSEPPP (s[1], s[3], d[1], d[3]);
+ d[2] = NR_COMPOSEPPP (s[2], s[3], d[2], d[3]);
+ d[3] = NR_A7_NORMALIZED(s[3],d[3]);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+