summaryrefslogtreecommitdiffstats
path: root/src/libnr/nr-compose.cpp
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-08-05 04:01:01 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-08-05 04:01:01 +0000
commit13e643c744ca21ea6f5a50d404bec8aac886a808 (patch)
tree94f0ad849ad7f2ad60fb442848a46f31a89fe1a0 /src/libnr/nr-compose.cpp
parentFix mask rendering to use luminance-to-alpha (diff)
downloadinkscape-13e643c744ca21ea6f5a50d404bec8aac886a808.tar.gz
inkscape-13e643c744ca21ea6f5a50d404bec8aac886a808.zip
Wholesale cruft removal part 5; completely remove RasterFont
(bzr r9508.1.50)
Diffstat (limited to 'src/libnr/nr-compose.cpp')
-rw-r--r--src/libnr/nr-compose.cpp1197
1 files changed, 0 insertions, 1197 deletions
diff --git a/src/libnr/nr-compose.cpp b/src/libnr/nr-compose.cpp
deleted file mode 100644
index 74f9d036b..000000000
--- a/src/libnr/nr-compose.cpp
+++ /dev/null
@@ -1,1197 +0,0 @@
-#define __NR_COMPOSE_C__
-
-/*
- * Pixel buffer rendering library
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * This code is in public domain
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <string.h>
-#include "nr-pixops.h"
-
-#ifdef WITH_MMX
-/* fixme: */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-int nr_have_mmx (void);
-void nr_mmx_R8G8B8A8_P_EMPTY_A8_RGBAP (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned char *c);
-void nr_mmx_R8G8B8A8_P_R8G8B8A8_P_A8_RGBAP (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned char *c);
-void nr_mmx_R8G8B8_R8G8B8_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha);
-#define NR_PIXOPS_MMX nr_have_mmx ()
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif
-
-// Naming: nr_RESULT_BACKGROUND_FOREGROUND_extra
-
-void
-nr_R8G8B8A8_N_EMPTY_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- if (alpha == 0) {
- memset(px, 0x0, 4 * w);
- } else if (alpha == 255) {
- memcpy(px, spx, 4 * w);
- } else {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- *d++ = *s++;
- *d++ = *s++;
- *d++ = *s++;
- *d++ = NR_PREMUL_111(*s, alpha);
- s++;
- }
- }
- px += rs;
- spx += srs;
- }
-}
-
-void
-nr_R8G8B8A8_N_EMPTY_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- if (alpha == 0) {
- memset(px, 0x0, 4 * w);
- } else {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- d[3] = 0;
- } else if (s[3] == 255) {
- memcpy(d, s, 4);
- } else {
- d[0] = NR_DEMUL_111(s[0], s[3]);
- d[1] = NR_DEMUL_111(s[1], s[3]);
- d[2] = NR_DEMUL_111(s[2], s[3]);
- d[3] = NR_PREMUL_111(s[3], alpha);
- }
- d += 4;
- s += 4;
- }
- }
- px += rs;
- spx += srs;
- }
-}
-
-void
-nr_R8G8B8A8_P_EMPTY_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- if (alpha == 0) {
- memset(px, 0x0, 4 * w);
- } else if (alpha == 255) {
- for (c = w; c > 0; c--) {
- d[0] = NR_PREMUL_111(s[0], s[3]);
- d[1] = NR_PREMUL_111(s[1], s[3]);
- d[2] = NR_PREMUL_111(s[2], s[3]);
- d[3] = s[3];
- d += 4;
- s += 4;
- }
- } else {
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- memset(d, 0, 4);
- } else {
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- d[0] = NR_PREMUL_121(s[0], a);
- d[1] = NR_PREMUL_121(s[1], a);
- d[2] = NR_PREMUL_121(s[2], a);
- d[3] = NR_NORMALIZE_21(a);
- }
- d += 4;
- s += 4;
- }
- }
- px += rs;
- spx += srs;
- }
-}
-
-void
-nr_R8G8B8A8_P_EMPTY_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- if (alpha == 0) {
- memset(px, 0x0, 4 * w);
- } else if (alpha == 255) {
- memcpy(px, spx, 4 * w);
- } else {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- d[0] = NR_PREMUL_111(s[0], alpha);
- d[1] = NR_PREMUL_111(s[1], alpha);
- d[2] = NR_PREMUL_111(s[2], alpha);
- d[3] = NR_PREMUL_111(s[3], alpha);
- d += 4;
- s += 4;
- }
- }
- px += rs;
- spx += srs;
- }
-}
-
-void
-nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- if (alpha == 0) {
- /* NOP */
- } else if (alpha == 255) {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- /* Transparent FG, NOP */
- } else if ((s[3] == 255) || (d[3] == 0)) {
- /* Full coverage, COPY */
- memcpy(d, s, 4);
- } else {
- /* Full composition */
- unsigned int ca;
- ca = NR_COMPOSEA_112(s[3], d[3]);
- d[0] = NR_COMPOSENNN_111121(s[0], s[3], d[0], d[3], ca);
- d[1] = NR_COMPOSENNN_111121(s[1], s[3], d[1], d[3], ca);
- d[2] = NR_COMPOSENNN_111121(s[2], s[3], d[2], d[3], ca);
- d[3] = NR_NORMALIZE_21(ca);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if ((a == 255*255) || (d[3] == 0)) {
- /* Full coverage, COPY */
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- d[3] = NR_NORMALIZE_21(a);
- } else {
- /* Full composition */
- unsigned int ca;
- ca = NR_COMPOSEA_213(a, d[3]);
- d[0] = NR_COMPOSENNN_121131(s[0], a, d[0], d[3], ca);
- d[1] = NR_COMPOSENNN_121131(s[1], a, d[1], d[3], ca);
- d[2] = NR_COMPOSENNN_121131(s[2], a, d[2], d[3], ca);
- d[3] = NR_NORMALIZE_31(ca);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-void
-nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- if (alpha == 0) {
- /* NOP */
- } else if (alpha == 255) {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- /* Transparent FG, NOP */
- } else if (s[3] == 255) {
- /* Full coverage, demul src */
- // dc' = ((1 - sa) * da*dc + sc)/da' = sc/da' = sc
- // da' = 1 - (1 - sa) * (1 - da) = 1 - 0 * (1 - da) = 1
- memcpy(d, s, 4);
- } else if (d[3] == 0) {
- /* Full coverage, demul src */
- // dc' = ((1 - sa) * da*dc + sc)/da' = sc/da' = sc/sa = sc/sa
- // da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) = sa
- d[0] = NR_DEMUL_111(s[0], s[3]);
- d[1] = NR_DEMUL_111(s[1], s[3]);
- d[2] = NR_DEMUL_111(s[2], s[3]);
- d[3] = s[3];
- } else {
- /* Full composition */
- // dc' = ((1 - sa) * da*dc + sc)/da' = ((1 - sa) * da*dc + sc)/da'
- // da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) * (1 - da)
- unsigned int da = NR_COMPOSEA_112(s[3], d[3]);
- d[0] = NR_COMPOSEPNN_111121(s[0], s[3], d[0], d[3], da);
- d[1] = NR_COMPOSEPNN_111121(s[1], s[3], d[1], d[3], da);
- d[2] = NR_COMPOSEPNN_111121(s[2], s[3], d[2], d[3], da);
- d[3] = NR_NORMALIZE_21(da);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (d[3] == 0) {
- /* Full coverage, demul src */
- // dc' = ((1 - alpha*sa) * da*dc + alpha*sc)/da' = alpha*sc/da' = alpha*sc/(alpha*sa) = sc/sa
- // da' = 1 - (1 - alpha*sa) * (1 - da) = 1 - (1 - alpha*sa) = alpha*sa
- d[0] = NR_DEMUL_111(s[0], s[3]);
- d[1] = NR_DEMUL_111(s[1], s[3]);
- d[2] = NR_DEMUL_111(s[2], s[3]);
- d[3] = NR_NORMALIZE_21(a);
- } else {
- // dc' = ((1 - alpha*sa) * da*dc + alpha*sc)/da'
- // da' = 1 - (1 - alpha*sa) * (1 - da)
- unsigned int da = NR_COMPOSEA_213(a, d[3]);
- d[0] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[0], alpha), a, d[0], d[3], da);
- d[1] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[1], alpha), a, d[1], d[3], da);
- d[2] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[2], alpha), a, d[2], d[3], da);
- d[3] = NR_NORMALIZE_31(da);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-void
-nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- if (alpha == 0) {
- /* NOP */
- } else if (alpha == 255) {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- /* Transparent FG, NOP */
- } else if (s[3] == 255) {
- /* Opaque FG, COPY */
- // dc' = (1 - sa) * dc + sa*sc = sa*sc = sc
- // da' = 1 - (1 - sa) * (1 - da) = 1 - 0 * (1 - da) = 1 (= sa)
- memcpy(d, s, 4);
- } else if (d[3] == 0) {
- /* Transparent BG, premul src */
- // dc' = (1 - sa) * dc + sa*sc = sa*sc
- // da' = 1 - (1 - sa) * (1 - da) = 1 - (1 - sa) = sa
- d[0] = NR_PREMUL_111(s[0], s[3]);
- d[1] = NR_PREMUL_111(s[1], s[3]);
- d[2] = NR_PREMUL_111(s[2], s[3]);
- d[3] = s[3];
- } else {
- // dc' = (1 - sa) * dc + sa*sc
- // da' = 1 - (1 - sa) * (1 - da)
- d[0] = NR_COMPOSENPP_1111(s[0], s[3], d[0]);
- d[1] = NR_COMPOSENPP_1111(s[1], s[3], d[1]);
- d[2] = NR_COMPOSENPP_1111(s[2], s[3], d[2]);
- d[3] = NR_COMPOSEA_111(s[3], d[3]);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112 (s[3], alpha);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (d[3] == 0) {
- /* Transparent BG, premul src */
- // dc' = (1 - alpha*sa) * dc + alpha*sa*sc = alpha*sa*sc
- // da' = 1 - (1 - alpha*sa) * (1 - da) = 1 - (1 - alpha*sa) = alpha*sa
- d[0] = NR_PREMUL_121(s[0], a);
- d[1] = NR_PREMUL_121(s[1], a);
- d[2] = NR_PREMUL_121(s[2], a);
- d[3] = NR_NORMALIZE_21(a);
- } else {
- // dc' = (1 - alpha*sa) * dc + alpha*sa*sc
- // da' = 1 - (1 - alpha*sa) * (1 - da)
- d[0] = NR_COMPOSENPP_1211(s[0], a, d[0]);
- d[1] = NR_COMPOSENPP_1211(s[1], a, d[1]);
- d[2] = NR_COMPOSENPP_1211(s[2], a, d[2]);
- d[3] = NR_COMPOSEA_211(a, d[3]);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-void
-nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- if (alpha == 0) {
- /* Transparent FG, NOP */
- } else if (alpha == 255) {
- /* Simple */
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- /* Transparent FG, NOP */
- } else if ((s[3] == 255) || (d[3] == 0)) {
- /* Transparent BG, COPY */
- memcpy(d, s, 4);
- } else {
- d[0] = NR_COMPOSEPPP_1111(s[0], s[3], d[0]);
- d[1] = NR_COMPOSEPPP_1111(s[1], s[3], d[1]);
- d[2] = NR_COMPOSEPPP_1111(s[2], s[3], d[2]);
- d[3] = NR_COMPOSEA_111(s[3], d[3]);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- if (s[3] == 0) {
- /* Transparent FG, NOP */
- } else if (d[3] == 0) {
- /* Transparent BG, COPY */
- d[0] = NR_PREMUL_111(s[0], alpha);
- d[1] = NR_PREMUL_111(s[1], alpha);
- d[2] = NR_PREMUL_111(s[2], alpha);
- d[3] = NR_PREMUL_111(s[3], alpha);
- } else {
- // dc' = (1 - alpha*sa) * dc + alpha*sc
- // da' = 1 - (1 - alpha*sa) * (1 - da)
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- d[0] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[0]), a, d[0]);
- d[1] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[1]), a, d[1]);
- d[2] = NR_COMPOSEPPP_2211(NR_PREMUL_112(alpha, s[2]), a, d[2]);
- d[3] = NR_COMPOSEA_211(a, d[3]);
- }
- d += 4;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-/* Masked operations */
-
-void
-nr_R8G8B8A8_N_EMPTY_R8G8B8A8_N_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- d[3] = NR_PREMUL_111(s[3], m[0]);
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_N_EMPTY_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112 (s[3], m[0]);
- if (a == 0) {
- d[3] = 0;
- } else if (a == 255*255) {
- memcpy(d, s, 4);
- } else {
- // dc' = ((1 - m*sa) * da*dc + m*sc)/da' = m*sc/da' = m*sc/(m*sa) = sc/sa
- // da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - m*sa) = m*sa
- d[0] = NR_DEMUL_111(s[0], s[3]);
- d[1] = NR_DEMUL_111(s[1], s[3]);
- d[2] = NR_DEMUL_111(s[2], s[3]);
- d[3] = NR_NORMALIZE_21(a);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_P_EMPTY_R8G8B8A8_N_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- memset(d, 0, 4);
- } else if (a == 255*255) {
- memcpy(d, s, 4);
- } else {
- d[0] = NR_PREMUL_121(s[0], a);
- d[1] = NR_PREMUL_121(s[1], a);
- d[2] = NR_PREMUL_121(s[2], a);
- d[3] = NR_NORMALIZE_21(a);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_P_EMPTY_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- d[0] = NR_PREMUL_111(s[0], m[0]);
- d[1] = NR_PREMUL_111(s[1], m[0]);
- d[2] = NR_PREMUL_111(s[2], m[0]);
- d[3] = NR_PREMUL_111(s[3], m[0]);
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_N_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if ((a == 255*255) || (d[3] == 0)) {
- /* Full coverage, COPY */
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- d[3] = NR_NORMALIZE_21(a);
- } else {
- /* Full composition */
- unsigned int ca;
- ca = NR_COMPOSEA_213(a, d[3]);
- d[0] = NR_COMPOSENNN_121131(s[0], a, d[0], d[3], ca);
- d[1] = NR_COMPOSENNN_121131(s[1], a, d[1], d[3], ca);
- d[2] = NR_COMPOSENNN_121131(s[2], a, d[2], d[3], ca);
- d[3] = NR_NORMALIZE_31(ca);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_N_R8G8B8A8_N_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (a == 255*255) {
- /* Opaque FG, COPY */
- memcpy(d, s, 4);
- } else if (d[3] == 0) {
- /* Full coverage, demul src */
- // dc' = ((1 - m*sa) * da*dc + m*sc)/da' = m*sc/da' = m*sc/(m*sa) = sc/sa
- // da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - m*sa) = m*sa
- d[0] = NR_DEMUL_111(s[0], s[3]);
- d[1] = NR_DEMUL_111(s[1], s[3]);
- d[2] = NR_DEMUL_111(s[2], s[3]);
- d[3] = NR_NORMALIZE_21(a);
- } else if (m[0] == 255) {
- /* Full composition */
- // dc' = ((1 - m*sa) * da*dc + m*sc)/da' = ((1 - sa) * da*dc + sc)/da'
- // da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - sa) * (1 - da)
- unsigned int da = NR_COMPOSEA_112(s[3], d[3]);
- d[0] = NR_COMPOSEPNN_111121(s[0], s[3], d[0], d[3], da);
- d[1] = NR_COMPOSEPNN_111121(s[1], s[3], d[1], d[3], da);
- d[2] = NR_COMPOSEPNN_111121(s[2], s[3], d[2], d[3], da);
- d[3] = NR_NORMALIZE_21(da);
- } else {
- // dc' = ((1 - m*sa) * da*dc + m*sc)/da'
- // da' = 1 - (1 - m*sa) * (1 - da)
- unsigned int da = NR_COMPOSEA_213(a, d[3]);
- d[0] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[0], m[0]), a, d[0], d[3], da);
- d[1] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[1], m[0]), a, d[1], d[3], da);
- d[2] = NR_COMPOSEPNN_221131(NR_PREMUL_112(s[2], m[0]), a, d[2], d[3], da);
- d[3] = NR_NORMALIZE_31(da);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_N_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r>0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c>0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (a == 255*255) {
- memcpy(d, s, 4);
- } else {
- d[0] = NR_COMPOSENPP_1211(s[0], a, d[0]);
- d[1] = NR_COMPOSENPP_1211(s[1], a, d[1]);
- d[2] = NR_COMPOSENPP_1211(s[2], a, d[2]);
- d[3] = NR_COMPOSEA_211(a, d[3]);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_P_R8G8B8A8_P_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int r, c;
-
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- const unsigned char *m = mpx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112 (s[3], m[0]);
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (a == 255*255) {
- /* Opaque FG, COPY */
- memcpy(d, s, 4);
- } else if (d[3] == 0) {
- /* Transparent BG, COPY */
- // dc' = (1 - m*sa) * dc + m*sc = m*sc
- // da' = 1 - (1 - m*sa) * (1 - da) = 1 - (1 - m*sa) = m*sa
- d[0] = NR_PREMUL_111 (s[0], m[0]);
- d[1] = NR_PREMUL_111 (s[1], m[0]);
- d[2] = NR_PREMUL_111 (s[2], m[0]);
- d[3] = NR_NORMALIZE_21(a);
- } else {
- // dc' = (1 - m*sa) * dc + m*sc
- // da' = 1 - (1 - m*sa) * (1 - da)
- d[0] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[0], m[0]), a, d[0]);
- d[1] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[1], m[0]), a, d[1]);
- d[2] = NR_COMPOSEPPP_2211 (NR_PREMUL_112 (s[2], m[0]), a, d[2]);
- d[3] = NR_COMPOSEA_211(a, d[3]);
- }
- d += 4;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-/* FINAL DST MASK COLOR */
-
-void
-nr_R8G8B8A8_N_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
-{
- unsigned int r, g, b, a;
- unsigned int x, y;
-
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
-
- for (y = h; y > 0; y--) {
- if (a == 0) {
- memset(px, 0, w*4);
- } else {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- for (x = w; x > 0; x--) {
- d[0] = r;
- d[1] = g;
- d[2] = b;
- d[3] = NR_PREMUL_111 (m[0], a);
- d += 4;
- m += 1;
- }
- }
- px += rs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8A8_P_EMPTY_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
-{
- unsigned int r, g, b, a;
- unsigned int x, y;
-
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
-
-#ifdef WITH_MMX
- if (NR_PIXOPS_MMX) {
- unsigned char c[4];
- c[0] = NR_PREMUL_111 (r, a);
- c[1] = NR_PREMUL_111 (g, a);
- c[2] = NR_PREMUL_111 (b, a);
- c[3] = a;
- /* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
- nr_mmx_R8G8B8A8_P_EMPTY_A8_RGBAP (px, w, h, rs, mpx, mrs, c);
- // This mmx optimized code is approx. 2x faster than the non-optimized code below (Measured by Diederik van Lierop, 2009-12-17)
- return;
- }
-#endif
-
- if ( a != 255 ){
- // Pre-premultiply color values
- r *= a;
- g *= a;
- b *= a;
- }
-
- for (y = h; y > 0; y--) {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- if (a == 0) {
- memset(px, 0, w*4);
- } else if (a == 255) {
- for (x = w; x > 0; x--) {
- d[0] = NR_PREMUL_111(m[0], r);
- d[1] = NR_PREMUL_111(m[0], g);
- d[2] = NR_PREMUL_111(m[0], b);
- d[3] = m[0];
- d += 4;
- m += 1;
- }
- } else {
- for (x = w; x > 0; x--) {
- // Color values are already premultiplied with a
- d[0] = NR_PREMUL_121(m[0], r);
- d[1] = NR_PREMUL_121(m[0], g);
- d[2] = NR_PREMUL_121(m[0], b);
- d[3] = NR_PREMUL_111(m[0], a);
- d += 4;
- m += 1;
- }
- }
- px += rs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8_R8G8B8_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
-{
- unsigned int r, g, b, a;
- unsigned int x, y;
-
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
-
- if (a == 0) {
- /* NOP */
- } else if (a == 255) {
- for (y = h; y > 0; y--) {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- for (x = w; x > 0; x--) {
- d[0] = NR_COMPOSEN11_1111 (r, m[0], d[0]);
- d[1] = NR_COMPOSEN11_1111 (g, m[0], d[1]);
- d[2] = NR_COMPOSEN11_1111 (b, m[0], d[2]);
- d += 3;
- m += 1;
- }
- px += rs;
- mpx += mrs;
- }
- } else {
- for (y = h; y > 0; y--) {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- for (x = w; x > 0; x--) {
- // dc' = (1 - m*sa) * dc + m*sa*sc
- unsigned int alpha;
- alpha = NR_PREMUL_112 (a, m[0]);
- d[0] = NR_COMPOSEN11_1211 (r, alpha, d[0]);
- d[1] = NR_COMPOSEN11_1211 (g, alpha, d[1]);
- d[2] = NR_COMPOSEN11_1211 (b, alpha, d[2]);
- d += 3;
- m += 1;
- }
- px += rs;
- mpx += mrs;
- }
- }
-}
-
-void
-nr_R8G8B8A8_N_R8G8B8A8_N_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *mpx, int mrs, unsigned long rgba)
-{
- unsigned int r, g, b, a;
- unsigned int x, y;
-
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
-
- if (a == 0) {
- /* NOP */
- } else if (a == 255) {
- for (y = h; y > 0; y--) {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- for (x = w; x > 0; x--) {
- if (m[0] == 0) {
- /* Transparent FG, NOP */
- } else if (m[0] == 255 || d[3] == 0) {
- /* Full coverage, COPY */
- d[0] = r;
- d[1] = g;
- d[2] = b;
- d[3] = m[0];
- } else {
- /* Full composition */
- unsigned int da = NR_COMPOSEA_112(m[0], d[3]);
- d[0] = NR_COMPOSENNN_111121(r, m[0], d[0], d[3], da);
- d[1] = NR_COMPOSENNN_111121(g, m[0], d[1], d[3], da);
- d[2] = NR_COMPOSENNN_111121(b, m[0], d[2], d[3], da);
- d[3] = NR_NORMALIZE_21(da);
- }
- d += 4;
- m += 1;
- }
- px += rs;
- mpx += mrs;
- }
- } else {
- for (y = h; y > 0; y--) {
- unsigned char *d = px;
- const unsigned char *m = mpx;
- for (x = w; x > 0; x--) {
- unsigned int ca;
- ca = NR_PREMUL_112 (m[0], a);
- if (ca == 0) {
- /* Transparent FG, NOP */
- } else if (d[3] == 0) {
- /* Full coverage, COPY */
- d[0] = r;
- d[1] = g;
- d[2] = b;
- d[3] = NR_NORMALIZE_21(ca);
- } else {
- /* Full composition */
- unsigned int da = NR_COMPOSEA_213(ca, d[3]);
- d[0] = NR_COMPOSENNN_121131(r, ca, d[0], d[3], da);
- d[1] = NR_COMPOSENNN_121131(g, ca, d[1], d[3], da);
- d[2] = NR_COMPOSENNN_121131(b, ca, d[2], d[3], da);
- d[3] = NR_NORMALIZE_31(da);
- }
- d += 4;
- m += 1;
- }
- px += rs;
- mpx += mrs;
- }
- }
-}
-
-void
-nr_R8G8B8A8_P_R8G8B8A8_P_A8_RGBA32 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned long rgba)
-{
- unsigned int r, g, b, a;
- unsigned int x, y;
-
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
-
-#ifdef WITH_MMX
- if (NR_PIXOPS_MMX && a != 0) {
- unsigned char c[4];
- c[0] = NR_PREMUL_111 (r, a);
- c[1] = NR_PREMUL_111 (g, a);
- c[2] = NR_PREMUL_111 (b, a);
- c[3] = a;
- /* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
- nr_mmx_R8G8B8A8_P_R8G8B8A8_P_A8_RGBAP (px, w, h, rs, spx, srs, c);
- return;
- }
-#endif
-
- if (a == 0) {
- /* Transparent FG, NOP */
- } else if (a == 255) {
- /* Simple */
- for (y = h; y > 0; y--) {
- unsigned char *d, *s;
- d = (unsigned char *) px;
- s = (unsigned char *) spx;
- for (x = w; x > 0; x--) {
- if (s[0] == 0) {
- /* Transparent FG, NOP */
- } else {
- /* Full composition */
- unsigned int invca = 255-s[0]; // By swapping the arguments GCC can better optimize these calls
- d[0] = NR_COMPOSENPP_1111(d[0], invca, r);
- d[1] = NR_COMPOSENPP_1111(d[1], invca, g);
- d[2] = NR_COMPOSENPP_1111(d[2], invca, b);
- d[3] = NR_COMPOSEA_111(s[0], d[3]);
- }
- d += 4;
- s += 1;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (y = h; y > 0; y--) {
- unsigned char *d, *s;
- d = (unsigned char *) px;
- s = (unsigned char *) spx;
- for (x = w; x > 0; x--) {
- unsigned int ca;
- ca = NR_PREMUL_112 (s[0], a);
- if (ca == 0) {
- /* Transparent FG, NOP */
- } else {
- /* Full composition */
- unsigned int invca = 255*255-ca; // By swapping the arguments GCC can better optimize these calls
- d[0] = NR_COMPOSENPP_1211(d[0], invca, r);
- d[1] = NR_COMPOSENPP_1211(d[1], invca, g);
- d[2] = NR_COMPOSENPP_1211(d[2], invca, b);
- d[3] = NR_COMPOSEA_211(ca, d[3]);
- }
- d += 4;
- s += 1;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-/* RGB */
-
-void
-nr_R8G8B8_R8G8B8_R8G8B8A8_P (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
-#ifdef WITH_MMX
- if (NR_PIXOPS_MMX && alpha != 0) {
- /* WARNING: MMX composer REQUIRES w > 0 and h > 0 */
- nr_mmx_R8G8B8_R8G8B8_R8G8B8A8_P (px, w, h, rs, spx, srs, alpha);
- return;
- }
-#endif
-
- if (alpha == 0) {
- /* NOP */
- } else if (alpha == 255) {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- // dc' = (1 - alpha*sa) * dc + alpha*sc = (1 - sa) * dc + sc
- if (s[3] == 0) {
- /* NOP */
- } else if (s[3] == 255) {
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- } else {
- d[0] = NR_COMPOSEP11_1111(s[0], s[3], d[0]);
- d[1] = NR_COMPOSEP11_1111(s[1], s[3], d[1]);
- d[2] = NR_COMPOSEP11_1111(s[2], s[3], d[2]);
- }
- d += 3;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- // dc' = (1 - alpha*sa) * dc + alpha*sc
- if (a == 0) {
- /* NOP */
- } else {
- d[0] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[0], alpha), a, d[0]);
- d[1] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[1], alpha), a, d[1]);
- d[2] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[2], alpha), a, d[2]);
- }
- /* a == 255 is impossible, because alpha < 255 */
- d += 3;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-void
-nr_R8G8B8_R8G8B8_R8G8B8A8_N (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, unsigned int alpha)
-{
- unsigned int r, c;
-
- if (alpha == 0) {
- /* NOP */
- } else if (alpha == 255) {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- // dc' = (1 - alpha*sa) * dc + alpha*sa*sc = (1 - sa) * dc + sa*sc
- if (s[3] == 0) {
- /* NOP */
- } else if (s[3] == 255) {
- d[0] = s[0];
- d[1] = s[1];
- d[2] = s[2];
- } else {
- d[0] = NR_COMPOSEN11_1111(s[0], s[3], d[0]);
- d[1] = NR_COMPOSEN11_1111(s[1], s[3], d[1]);
- d[2] = NR_COMPOSEN11_1111(s[2], s[3], d[2]);
- }
- d += 3;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- } else {
- for (r = h; r > 0; r--) {
- unsigned char *d = px;
- const unsigned char *s = spx;
- for (c = w; c > 0; c--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], alpha);
- // dc' = (1 - alpha*sa) * dc + alpha*sa*sc
- if (a == 0) {
- /* NOP */
- } else {
- d[0] = NR_COMPOSEN11_1211(s[0], a, d[0]);
- d[1] = NR_COMPOSEN11_1211(s[1], a, d[1]);
- d[2] = NR_COMPOSEN11_1211(s[2], a, d[2]);
- }
- /* a == 255 is impossible, because alpha < 255 */
- d += 3;
- s += 4;
- }
- px += rs;
- spx += srs;
- }
- }
-}
-
-void
-nr_R8G8B8_R8G8B8_R8G8B8A8_P_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int x, y;
-
- for (y = h; y > 0; y--) {
- unsigned char* d = px;
- const unsigned char* s = spx;
- const unsigned char* m = mpx;
- for (x = w; x > 0; x--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- /* NOP */
- } else if (a == 255*255) {
- memcpy(d, s, 3);
- } else {
- // dc' = (1 - m*sa) * dc + m*sc
- d[0] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[0], m[0]), a, d[0]);
- d[1] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[1], m[0]), a, d[1]);
- d[2] = NR_COMPOSEP11_2211(NR_PREMUL_112(s[2], m[0]), a, d[2]);
- }
- d += 3;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-void
-nr_R8G8B8_R8G8B8_R8G8B8A8_N_A8 (unsigned char *px, int w, int h, int rs, const unsigned char *spx, int srs, const unsigned char *mpx, int mrs)
-{
- unsigned int x, y;
-
- for (y = h; y > 0; y--) {
- unsigned char* d = px;
- const unsigned char* s = spx;
- const unsigned char* m = mpx;
- for (x = w; x > 0; x--) {
- unsigned int a;
- a = NR_PREMUL_112(s[3], m[0]);
- if (a == 0) {
- /* NOP */
- } else if (a == 255*255) {
- memcpy(d, s, 3);
- } else {
- // dc' = (1 - m*sa) * dc + m*sa*sc
- d[0] = NR_COMPOSEN11_1211(s[0], a, d[0]);
- d[1] = NR_COMPOSEN11_1211(s[1], a, d[1]);
- d[2] = NR_COMPOSEN11_1211(s[2], a, d[2]);
- }
- d += 3;
- s += 4;
- m += 1;
- }
- px += rs;
- spx += srs;
- mpx += mrs;
- }
-}
-
-