diff options
author | Robin Watts <robin.watts@artifex.com> | 2010-12-01 13:04:53 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2010-12-01 13:04:53 +0000 |
commit | cdbff0b29a66cd25abc07f1da2041b4727cd7b45 (patch) | |
tree | 5c37b64084b58b57dc3c862a7a8959ae723e0fdc | |
parent | 69815ed8f21f60ff382e129e21f85f77a67a52be (diff) | |
download | mupdf-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.c | 37 |
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++; } } |