summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2010-12-01 13:04:53 +0000
committerRobin Watts <robin.watts@artifex.com>2010-12-01 13:04:53 +0000
commitcdbff0b29a66cd25abc07f1da2041b4727cd7b45 (patch)
tree5c37b64084b58b57dc3c862a7a8959ae723e0fdc
parent69815ed8f21f60ff382e129e21f85f77a67a52be (diff)
downloadmupdf-cdbff0b29a66cd25abc07f1da2041b4727cd7b45.tar.xz
Fix rounding behaviour when using FZ_COMBINE2.
An alternative fix would be to change the FZ_COMBINE2 macro to (A*B)>>8 + (C*D)>>8 instead of computing a separate "imasa" variable.
-rw-r--r--draw/porterduff.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/draw/porterduff.c b/draw/porterduff.c
index d36160b6..e9d6d12d 100644
--- a/draw/porterduff.c
+++ b/draw/porterduff.c
@@ -143,15 +143,15 @@ fz_paintspanmask2(byte * restrict dp, byte * restrict sp, byte * restrict mp, in
{
while (w--)
{
- int masa;
+ int masa, imasa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
masa = FZ_COMBINE(sp[1], ma);
- masa = 255 - masa;
- masa = FZ_EXPAND(masa);
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ imasa = 255 - masa;
+ imasa = FZ_EXPAND(imasa);
+ *dp = FZ_COMBINE2(*sp, ma, *dp, imasa);
sp++; dp++;
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ *dp = masa + FZ_COMBINE(*dp, imasa);
sp++; dp++;
}
}
@@ -161,19 +161,19 @@ fz_paintspanmask4(byte * restrict dp, byte * restrict sp, byte * restrict mp, in
{
while (w--)
{
- int masa;
+ int masa, imasa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
masa = FZ_COMBINE(sp[3], ma);
- masa = 255 - masa;
- masa = FZ_EXPAND(masa);
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ imasa = 255 - masa;
+ imasa = FZ_EXPAND(imasa);
+ *dp = FZ_COMBINE2(*sp, ma, *dp, imasa);
sp++; dp++;
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ *dp = FZ_COMBINE2(*sp, ma, *dp, imasa);
sp++; dp++;
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ *dp = FZ_COMBINE2(*sp, ma, *dp, imasa);
sp++; dp++;
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ *dp = masa + FZ_COMBINE(*dp, imasa);
sp++; dp++;
}
}
@@ -181,20 +181,23 @@ fz_paintspanmask4(byte * restrict dp, byte * restrict sp, byte * restrict mp, in
static inline void
fz_paintspanmaskN(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w)
{
+ n--;
while (w--)
{
int k = n;
- int masa;
+ int masa, imasa;
int ma = *mp++;
ma = FZ_EXPAND(ma);
- masa = FZ_COMBINE(sp[n-1], ma);
- masa = 255-masa;
- masa = FZ_EXPAND(masa);
+ masa = FZ_COMBINE(sp[n], ma);
+ imasa = 255-masa;
+ imasa = FZ_EXPAND(imasa);
while (k--)
{
- *dp = FZ_COMBINE2(*sp, ma, *dp, masa);
+ *dp = FZ_COMBINE2(*sp, ma, *dp, imasa);
sp++; dp++;
}
+ *dp = masa + FZ_COMBINE(*dp, imasa);
+ sp++; dp++;
}
}