summaryrefslogtreecommitdiff
path: root/draw/arch_port.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-04-04 18:08:53 +0200
committerTor Andersson <tor.andersson@artifex.com>2011-04-04 18:08:53 +0200
commitc8d226b5bfb5dab2db10ea5175966de7bac9640e (patch)
tree982435a97942aeaf6a527eb3a07ac2c5242aaa9b /draw/arch_port.c
parent53faeef5a0f2e352cc89b1695ec1db1eda85e707 (diff)
downloadmupdf-c8d226b5bfb5dab2db10ea5175966de7bac9640e.tar.xz
draw: Rename files in draw directory.
Diffstat (limited to 'draw/arch_port.c')
-rw-r--r--draw/arch_port.c486
1 files changed, 486 insertions, 0 deletions
diff --git a/draw/arch_port.c b/draw/arch_port.c
new file mode 100644
index 00000000..c7be977a
--- /dev/null
+++ b/draw/arch_port.c
@@ -0,0 +1,486 @@
+#include "fitz.h"
+
+typedef unsigned char byte;
+
+/* These C implementations use SWAR (SIMD-within-a-register) techniques. */
+
+#if 0 /* TODO: move into porterduff.c functions */
+
+#define MASK 0xFF00FF00;
+
+static void
+path_w4i1o4_32bit(byte *rgba,
+ byte * restrict src, byte cov, int len, byte * restrict dst)
+{
+ /* COLOR * coverage + DST * (256-coverage) = (COLOR - DST)*coverage + DST*256 */
+ unsigned int *dst32 = (unsigned int *)(void *)dst;
+ int alpha = rgba[3];
+ unsigned int rb = rgba[0] | (rgba[2] << 16);
+ unsigned int ga = rgba[1] | 0xFF0000;
+
+ if (alpha == 0)
+ return;
+
+ if (alpha != 255)
+ {
+ alpha += alpha>>7; /* alpha is now in the 0...256 range */
+ while (len--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ cov += *src; *src++ = 0;
+ ca = cov + (cov>>7); /* ca is in 0...256 range */
+ ca = (ca*alpha)>>8; /* ca is is in 0...256 range */
+ drb = *dst32++;
+ if (ca != 0)
+ {
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga | (drb>>8);
+ dst32[-1] = drb;
+ }
+ }
+ }
+ else
+ {
+ while (len--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ cov += *src; *src++ = 0;
+ ca = cov + (cov>>7); /* ca is in 0...256 range */
+ drb = *dst32++;
+ if (ca == 0)
+ continue;
+ if (ca == 255)
+ {
+ drb = (ga<<8) | rb;
+ }
+ else
+ {
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga |(drb>>8);
+ }
+ dst32[-1] = drb;
+ }
+ }
+}
+
+static void
+text_w4i1o4_32bit(byte *rgba,
+ byte * restrict src, int srcw,
+ byte * restrict dst, int dstw, int w0, int h)
+{
+ unsigned int *dst32 = (unsigned int *)(void *)dst;
+ unsigned int alpha = rgba[3];
+ unsigned int rb = rgba[0] | (rgba[2] << 16);
+ unsigned int ga = rgba[1] | 0xFF0000;
+
+ if (alpha == 0)
+ return;
+
+ srcw -= w0;
+ dstw = (dstw>>2)-w0;
+
+ if (alpha != 255)
+ {
+ alpha += alpha>>7; /* alpha is now in the 0...256 range */
+ while (h--)
+ {
+ int w = w0;
+ while (w--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ ca = *src++;
+ drb = *dst32++;
+ ca += ca>>7;
+ ca = (ca*alpha)>>8;
+ if (ca == 0)
+ continue;
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga | (drb>>8);
+ dst32[-1] = drb;
+ }
+ src += srcw;
+ dst32 += dstw;
+ }
+ }
+ else
+ {
+ while (h--)
+ {
+ int w = w0;
+ while (w--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ ca = *src++;
+ drb = *dst32++;
+ ca += ca>>7;
+ if (ca == 0)
+ continue;
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga | (drb>>8);
+ dst32[-1] = drb;
+ }
+ src += srcw;
+ dst32 += dstw;
+ }
+ }
+}
+
+static void
+img_4o4_32bit(byte * restrict src, byte cov, int len, byte * restrict dst,
+ fz_pixmap *image, int u, int v, int fa, int fb)
+{
+ unsigned int *dst32 = (unsigned int *)(void *)dst;
+ unsigned int *samples = (unsigned int *)(void *)image->samples;
+ int w = image->w;
+ int h = image->h-1;
+
+ while (len--)
+ {
+ unsigned int a, a1, d, d1;
+ int sa;
+ cov += *src; *src = 0; src++;
+ /* (a,a1) = sampleargb(samples, w, h, u, v, argb); */
+ {
+ int ui, ui1, vi, vi1, ud, vd;
+ unsigned int b, b1, c, c1;
+ ui1 = 1;
+ ui = u >> 16;
+ if (ui < 0)
+ {
+ ui = 0;
+ ui1 = 0;
+ }
+ else if (ui >= w-1)
+ {
+ ui = w-1;
+ ui1 = 0;
+ }
+ vi1 = w;
+ vi = v >> 16;
+ if (vi < 0)
+ {
+ vi = 0;
+ vi1 = 0;
+ }
+ else if (vi >= h)
+ {
+ vi = h;
+ vi1 = 0;
+ }
+ ui += vi*w;
+ a = samples[ui];
+ b = samples[ui + ui1];
+ c = samples[ui + vi1];
+ d = samples[ui + ui1 + vi1];
+ ud = (u>>8) & 0xFF;
+ vd = (v>>8) & 0xFF;
+ ud = FZ_EXPAND(ud);
+ vd = FZ_EXPAND(vd);
+ /* (a,a1) = blend(a,b,ud) */
+ a1 = a & MASK;
+ a = (a<<8) & MASK;
+ b1 = (b>>8) & ~MASK;
+ b = b & ~MASK;
+ a = ((b -(a >>8)) * ud + a ) & MASK;
+ a1 = ((b1-(a1>>8)) * ud + a1) & MASK;
+ /* (c,c1) = blend(c,d,ud) */
+ c1 = c & MASK;
+ c = (c<<8) & MASK;
+ d1 = (d>>8) & ~MASK;
+ d = d & ~MASK;
+ c = ((d -(c >>8)) * ud + c ) & MASK;
+ c1 = ((d1-(c1>>8)) * ud + c1) & MASK;
+ /* (a,a1) = blend((a,a1),(c,c1),vd) */
+ a = (((c >>8)-(a >>8)) * vd + a ) & MASK;
+ a1 = (((c1>>8)-(a1>>8)) * vd + a1) & MASK;
+ }
+ sa = (a1>>24);
+ sa = FZ_COMBINE(FZ_EXPAND(sa), FZ_EXPAND(cov));
+ a1 |= 0xFF000000;
+ d = *dst32++;
+ d1 = d & MASK;
+ d = (d<<8) & MASK;
+ a = (((a >>8)-(d >>8)) * sa + d ) & MASK;
+ a1 = (((a1>>8)-(d1>>8)) * sa + d1) & MASK;
+ dst32[-1] = (a>>8) | a1;
+ u += fa;
+ v += fb;
+ }
+}
+
+static void
+img_w4i1o4_32bit(byte *rgba, byte * restrict src, byte cov, int len,
+ byte * restrict dst, fz_pixmap *image, int u, int v, int fa, int fb)
+{
+ byte *samples = image->samples;
+ int w = image->w;
+ int h = image->h-1;
+ int alpha = FZ_EXPAND(rgba[3]);
+ unsigned int rb = rgba[0] | (rgba[2] << 16);
+ unsigned int ga = rgba[1] | 0xFF0000;
+ unsigned int *dst32 = (unsigned int *)(void *)dst;
+
+ if (alpha == 0)
+ return;
+ if (alpha != 256)
+ {
+ while (len--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ unsigned int a, b;
+ cov += *src; *src = 0; src++;
+ drb = *dst32++;
+ ca = FZ_COMBINE(FZ_EXPAND(cov), alpha);
+ if (ca != 0)
+ {
+ int ui, ui1, vi, vi1, ud, vd;
+ /* a = samplemask(samples, w, h, u, v); */
+ ui1 = 1;
+ ui = u >> 16;
+ if (ui < 0)
+ {
+ ui = 0;
+ ui1 = 0;
+ }
+ else if (ui >= w-1)
+ {
+ ui = w-1;
+ ui1 = 0;
+ }
+ vi1 = w;
+ vi = v >> 16;
+ if (vi < 0)
+ {
+ vi = 0;
+ vi1 = 0;
+ }
+ else if (vi >= h)
+ {
+ vi = h;
+ vi1 = 0;
+ }
+ ui += vi*w;
+ a = samples[ui];
+ b = samples[ui + ui1];
+ a |= samples[ui + vi1]<<16;
+ b |= samples[ui + ui1 + vi1]<<16;
+ ud = (u>>8) & 0xFF;
+ vd = (v>>8) & 0xFF;
+ ud = FZ_EXPAND(ud);
+ vd = FZ_EXPAND(vd);
+ /* a = blend(a,b,ud) */
+ a = ((b-a) * ud + (a<<8)) & MASK;
+ /* a = blend(a,a>>16,vd) */
+ a = (((a>>24)-(a>>8)) * vd + a);
+ a = (a>>8) & 0xFF;
+ ca = FZ_COMBINE(ca, FZ_EXPAND(a));
+ }
+ if (ca != 0)
+ {
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga | (drb>>8);
+ dst32[-1] = drb;
+ }
+ u += fa;
+ v += fb;
+ }
+ }
+ else
+ {
+ while (len--)
+ {
+ unsigned int ca, drb, dga, crb, cga;
+ unsigned int a, b;
+ cov += *src; *src = 0; src++;
+ drb = *dst32++;
+ if (cov != 0)
+ {
+ int ui, ui1, vi, vi1, ud, vd;
+ /* a = samplemask(samples, w, h, u, v); */
+ ui1 = 1;
+ ui = u >> 16;
+ if (ui < 0)
+ {
+ ui = 0;
+ ui1 = 0;
+ }
+ else if (ui >= w-1)
+ {
+ ui = w-1;
+ ui1 = 0;
+ }
+ vi1 = w;
+ vi = v >> 16;
+ if (vi < 0)
+ {
+ vi = 0;
+ vi1 = 0;
+ }
+ else if (vi >= h)
+ {
+ vi = h;
+ vi1 = 0;
+ }
+ ui += vi*w;
+ a = samples[ui];
+ b = samples[ui + ui1];
+ a |= samples[ui + vi1]<<16;
+ b |= samples[ui + ui1 + vi1]<<16;
+ ud = (u>>8) & 0xFF;
+ vd = (v>>8) & 0xFF;
+ ud = FZ_EXPAND(ud);
+ vd = FZ_EXPAND(vd);
+ /* a = blend(a,b,ud) */
+ a = ((b-a) * ud + (a<<8)) & MASK;
+ /* a = blend(a,a>>16,vd) */
+ a = (((a>>24)-(a>>8)) * vd + a);
+ a = (a>>8) & 0xFF;
+ ca = FZ_COMBINE(FZ_EXPAND(cov),FZ_EXPAND(a));
+ if (ca != 0)
+ {
+ if (ca == 256)
+ {
+ drb = (ga<<8) | rb;
+ }
+ else
+ {
+ dga = drb & MASK;
+ drb = (drb<<8) & MASK;
+ cga = ga - (dga>>8);
+ crb = rb - (drb>>8);
+ dga += cga * ca;
+ drb += crb * ca;
+ dga &= MASK;
+ drb &= MASK;
+ drb = dga | (drb>>8);
+ }
+ dst32[-1] = drb;
+ }
+ }
+ u += fa;
+ v += fb;
+ }
+ }
+}
+
+static void
+img_1o1_32bit(byte * restrict src, byte cov, int len, byte * restrict dst,
+ fz_pixmap *image, int u, int v, int fa, int fb)
+{
+ byte *samples = image->samples;
+ int w = image->w;
+ int h = image->h-1;
+
+ while (len--)
+ {
+ unsigned int a, b;
+ cov += *src; *src = 0; src++;
+ if (cov != 0)
+ {
+ int ui, ui1, vi, vi1, ud, vd;
+ /* sa = samplemask(samples, w, h, u, v); */
+ ui1 = 1;
+ ui = u >> 16;
+ if (ui < 0)
+ {
+ ui = 0;
+ ui1 = 0;
+ }
+ else if (ui >= w-1)
+ {
+ ui = w-1;
+ ui1 = 0;
+ }
+ vi1 = w;
+ vi = v >> 16;
+ if (vi < 0)
+ {
+ vi = 0;
+ vi1 = 0;
+ }
+ else if (vi >= h)
+ {
+ vi = h;
+ vi1 = 0;
+ }
+ ui += vi*w;
+ a = samples[ui];
+ b = samples[ui + ui1];
+ a |= samples[ui + vi1]<<16;
+ b |= samples[ui + ui1 + vi1]<<16;
+ ud = (u>>8) & 0xFF;
+ vd = (v>>8) & 0xFF;
+ ud = FZ_EXPAND(ud);
+ vd = FZ_EXPAND(vd);
+ /* a = blend(a,b,ud) */
+ a = ((b-a) * ud + (a<<8)) & MASK;
+ /* a = blend(a,a>>16,vd) */
+ a = (((a>>24)-(a>>8)) * vd + a);
+ a = (a>>8) & 0xFF;
+ a = FZ_COMBINE(FZ_EXPAND(a), FZ_EXPAND(cov));
+ if (a != 0)
+ {
+ if (a == 256)
+ dst[0] = 255;
+ else
+ dst[0] = FZ_BLEND(255, dst[0], a);
+ }
+ }
+ dst++;
+ u += fa;
+ v += fb;
+ }
+}
+
+#endif
+
+void fz_accelerate(void)
+{
+ if (sizeof(int) == 4 && sizeof(unsigned int) == 4 && !fz_isbigendian())
+ {
+// fz_path_w4i1o4 = path_w4i1o4_32bit;
+// fz_text_w4i1o4 = text_w4i1o4_32bit;
+// fz_img_4o4 = img_4o4_32bit;
+// fz_img_w4i1o4 = img_w4i1o4_32bit;
+// fz_img_1o1 = img_1o1_32bit;
+ }
+
+#ifdef HAVE_CPUDEP
+ fz_acceleratearch();
+#endif
+}