diff options
| author | MenTaLguY <mental@rydia.net> | 2006-01-16 02:36:01 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2006-01-16 02:36:01 +0000 |
| commit | 179fa413b047bede6e32109e2ce82437c5fb8d34 (patch) | |
| tree | a5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/libnr/nr-pixblock-pixel.cpp | |
| download | inkscape-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.cpp | 230 |
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; + } + } +} + |
