diff options
author | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-21 23:48:10 +0100 |
---|---|---|
committer | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-21 23:48:10 +0100 |
commit | 15d836f1e88c9aa2b993f95f95b3bed2a0548ba1 (patch) | |
tree | 03dab413d621af264a742eccab8736aaa878eaea /raster/imagedraw.c | |
parent | 3e9200955bf75860835f1499fa699d2c0460cbcb (diff) | |
download | mupdf-15d836f1e88c9aa2b993f95f95b3bed2a0548ba1.tar.xz |
Fix fast path compositing. Constant color is NOT premultiplied.
Diffstat (limited to 'raster/imagedraw.c')
-rw-r--r-- | raster/imagedraw.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/raster/imagedraw.c b/raster/imagedraw.c index d7eb5dc7..1ad74bf7 100644 --- a/raster/imagedraw.c +++ b/raster/imagedraw.c @@ -201,13 +201,14 @@ static void img_4o4(FZ_PSRC, FZ_PDST, FZ_PCTM) } } -static void img_w3i1o4(byte *argb, FZ_PSRC, FZ_PDST, FZ_PCTM) +static void img_w4i1o4(byte *argb, FZ_PSRC, FZ_PDST, FZ_PCTM) { - byte ca = argb[0]; - byte rgb0 = argb[1]; - byte rgb1 = argb[2]; - byte rgb2 = argb[3]; - byte sa, ssa; + byte alpha = argb[0]; + byte r = argb[4]; + byte g = argb[5]; + byte b = argb[6]; + byte cov; + byte ca; while (h--) { byte *dstp = dst0; @@ -216,13 +217,12 @@ static void img_w3i1o4(byte *argb, FZ_PSRC, FZ_PDST, FZ_PCTM) int w = w0; while (w--) { - sa = samplemask(src, srcw, srch, u, v); - sa = fz_mul255(sa, ca); - ssa = 255 - sa; - dstp[0] = sa + fz_mul255(dstp[0], ssa); - dstp[1] = rgb0 + fz_mul255((short)dstp[1] - rgb0, ssa); - dstp[2] = rgb1 + fz_mul255((short)dstp[2] - rgb1, ssa); - dstp[3] = rgb2 + fz_mul255((short)dstp[3] - rgb2, ssa); + cov = samplemask(src, srcw, srch, u, v); + ca = fz_mul255(cov, alpha); + dstp[0] = ca + fz_mul255(dstp[0], 255 - ca); + dstp[1] = fz_mul255((short)r - dstp[1], ca) + dstp[1]; + dstp[2] = fz_mul255((short)g - dstp[2], ca) + dstp[2]; + dstp[3] = fz_mul255((short)b - dstp[3], ca) + dstp[3]; dstp += 4; u += fa; v += fb; @@ -238,5 +238,5 @@ void (*fz_img_1c1)(FZ_PSRC, FZ_PDST, FZ_PCTM) = img_1c1; void (*fz_img_4c4)(FZ_PSRC, FZ_PDST, FZ_PCTM) = img_4c4; void (*fz_img_1o1)(FZ_PSRC, FZ_PDST, FZ_PCTM) = img_1o1; void (*fz_img_4o4)(FZ_PSRC, FZ_PDST, FZ_PCTM) = img_4o4; -void (*fz_img_w3i1o4)(byte*,FZ_PSRC,FZ_PDST,FZ_PCTM) = img_w3i1o4; +void (*fz_img_w4i1o4)(byte*,FZ_PSRC,FZ_PDST,FZ_PCTM) = img_w4i1o4; |