summaryrefslogtreecommitdiff
path: root/source/fitz/draw-paint.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-10-06 17:45:47 +0100
committerRobin Watts <robin.watts@artifex.com>2016-10-07 16:56:46 +0100
commit7836643e0d6e9cc8e9d0d5c71cbfac5ee772ae21 (patch)
treea6cda5f755c09c25c4c78264e029f9e52b263bd4 /source/fitz/draw-paint.c
parenta9543691208e92c4ff8f7d1ff39d95543b557c60 (diff)
downloadmupdf-7836643e0d6e9cc8e9d0d5c71cbfac5ee772ae21.tar.xz
Optimise painters: Use SWAR to accelerate plotting.
Used for the file from bug 697122. Makes a small improvement overall. (31.3s to 31s for a cutdown file). The equivalent code using 64bit operations is slower.
Diffstat (limited to 'source/fitz/draw-paint.c')
-rw-r--r--source/fitz/draw-paint.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/source/fitz/draw-paint.c b/source/fitz/draw-paint.c
index 061ee630..50112d00 100644
--- a/source/fitz/draw-paint.c
+++ b/source/fitz/draw-paint.c
@@ -950,19 +950,42 @@ template_span_with_mask_3_general(byte * restrict dp, int da, const byte * restr
else
{
masa = FZ_EXPAND(masa);
- *dp = *sp + FZ_COMBINE(*dp, masa);
- sp++; dp++;
- *dp = *sp + FZ_COMBINE(*dp, masa);
- sp++; dp++;
- *dp = *sp + FZ_COMBINE(*dp, masa);
- sp++; dp++;
- if (da)
+ if (da && sa)
{
- *dp = (sa ? *sp : 255) + FZ_COMBINE(*dp, masa);
- dp++;
+ const uint32_t mask = 0x00ff00ff;
+ uint32_t d0 = *(uint32_t *)dp;
+ uint32_t d1 = d0>>8;
+ uint32_t s0 = *(uint32_t *)sp;
+ uint32_t s1 = s0>>8;
+ sp += 4;
+ d0 &= mask;
+ d1 &= mask;
+ s0 &= mask;
+ s1 &= mask;
+ s0 += (d0*masa)>>8;
+ s1 += (d1*masa)>>8;
+ s0 &= mask;
+ s1 &= mask;
+ s0 |= s1<<8;
+ *(uint32_t *)dp = s0;
+ dp += 4;
+ }
+ else
+ {
+ *dp = *sp + FZ_COMBINE(*dp, masa);
+ sp++; dp++;
+ *dp = *sp + FZ_COMBINE(*dp, masa);
+ sp++; dp++;
+ *dp = *sp + FZ_COMBINE(*dp, masa);
+ sp++; dp++;
+ if (da)
+ {
+ *dp = (sa ? *sp : 255) + FZ_COMBINE(*dp, masa);
+ dp++;
+ }
+ if (sa)
+ sp++;
}
- if (sa)
- sp++;
}
}
else