summaryrefslogtreecommitdiff
path: root/source/fitz/draw-paint.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-05-27 19:48:09 +0100
committerRobin Watts <robin.watts@artifex.com>2016-05-29 10:11:37 +0100
commit1c716190da76a19c17d9602c758edac090addf42 (patch)
tree84f174dec0e4d8065bb2fb271f566db9c04d3f56 /source/fitz/draw-paint.c
parent28a1ee7561ae92dd38023be94076e684eb7e9e59 (diff)
downloadmupdf-1c716190da76a19c17d9602c758edac090addf42.tar.xz
Accelerate common n=3 color case.
Diffstat (limited to 'source/fitz/draw-paint.c')
-rw-r--r--source/fitz/draw-paint.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/source/fitz/draw-paint.c b/source/fitz/draw-paint.c
index 56bc29c4..ef08dc98 100644
--- a/source/fitz/draw-paint.c
+++ b/source/fitz/draw-paint.c
@@ -246,6 +246,54 @@ fz_paint_solid_color_N_general(byte * restrict dp, int n, int w, const byte * re
return;
if (sa == 256)
{
+ if (n == 3 && w >= 8)
+ {
+ union {uint32_t w[3]; byte b[12];} u;
+
+ u.b[0] = u.b[3] = u.b[6] = u.b[9] = color[0];
+ u.b[1] = u.b[4] = u.b[7] = u.b[10] = color[1];
+ u.b[2] = u.b[5] = u.b[8] = u.b[11] = color[2];
+
+ switch (((intptr_t)dp) & 3)
+ {
+ case 3:
+ *dp++ = color[0];
+ *(uint32_t *)dp = u.w[1];
+ dp += 4;
+ *(uint32_t *)dp = u.w[2];
+ dp += 4;
+ w -= 3;
+ break;
+ case 2:
+ *dp++ = color[0];
+ *dp++ = color[1];
+ *(uint32_t *)dp = u.w[2];
+ dp += 4;
+ w -= 2;
+ break;
+ case 1:
+ *dp++ = color[0];
+ *dp++ = color[1];
+ *dp++ = color[2];
+ w -= 1;
+ break;
+ }
+ w -= 4;
+ do
+ {
+ *(uint32_t *)dp = u.w[0];
+ dp += 4;
+ *(uint32_t *)dp = u.w[1];
+ dp += 4;
+ *(uint32_t *)dp = u.w[2];
+ dp += 4;
+ w -= 4;
+ }
+ while (w > 0);
+ w += 4;
+ if (w == 0)
+ return;
+ }
do
{
dp[0] = color[0];