From 64b1c2c0b9d01abe4b37cca8929588875e6ba474 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 13 Oct 2010 12:42:54 +0000 Subject: Use EXPAND/BLEND/COMBINE macros for more plotting functions. Patch by Robin Watts. --- draw/porterduff.c | 208 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 122 insertions(+), 86 deletions(-) (limited to 'draw') diff --git a/draw/porterduff.c b/draw/porterduff.c index 59a4f4d4..c8d02a1e 100644 --- a/draw/porterduff.c +++ b/draw/porterduff.c @@ -82,9 +82,9 @@ fz_paintspancolor2(byte * restrict dp, byte * restrict mp, int w, byte *color) while (w--) { int ma = *mp++; - int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); - dp[0] = FZ_BLEND(g, dp[0], masa); - dp[1] = FZ_BLEND(255, dp[1], masa); + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + dp[0] = FZ_BLEND(g, dp[0], ma); + dp[1] = FZ_BLEND(255, dp[1], ma); dp += 2; } } @@ -99,11 +99,11 @@ fz_paintspancolor4(byte * restrict dp, byte * restrict mp, int w, byte *color) while (w--) { int ma = *mp++; - int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); - dp[0] = FZ_BLEND(r, dp[0], masa); - dp[1] = FZ_BLEND(g, dp[1], masa); - dp[2] = FZ_BLEND(b, dp[2], masa); - dp[3] = FZ_BLEND(255, dp[3], masa); + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + dp[0] = FZ_BLEND(r, dp[0], ma); + dp[1] = FZ_BLEND(g, dp[1], ma); + dp[2] = FZ_BLEND(b, dp[2], ma); + dp[3] = FZ_BLEND(255, dp[3], ma); dp += 4; } } @@ -113,13 +113,14 @@ fz_paintspancolorN(byte * restrict dp, byte * restrict mp, int n, int w, byte *c { int sa = FZ_EXPAND(color[n-1]); int k; + n--; while (w--) { int ma = *mp++; - int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); - for (k = 0; k < n - 1; k++) - dp[k] = FZ_BLEND(color[k], dp[k], masa); - dp[k] = FZ_BLEND(255, dp[k], masa); + ma = FZ_COMBINE(FZ_EXPAND(ma), sa); + for (k = 0; k < n; k++) + dp[k] = FZ_BLEND(color[k], dp[k], ma); + dp[k] = FZ_BLEND(255, dp[k], ma); dp += n; } } @@ -140,48 +141,63 @@ fz_paintspancolor(byte * restrict dp, byte * restrict mp, int n, int w, byte *co static inline void fz_paintspanmask2(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w) { - while (w--) + do { + int masa; int ma = *mp++; - int masa = fz_mul255(sp[1], ma); - int t = 255 - masa; - dp[0] = fz_mul255(sp[0], ma) + fz_mul255(dp[0], t); - dp[1] = fz_mul255(sp[1], ma) + fz_mul255(dp[1], t); - sp += 2; - dp += 2; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[1], ma); + masa = 255 - masa; + masa = FZ_EXPAND(masa); + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; } + while (--w); } static inline void fz_paintspanmask4(byte * restrict dp, byte * restrict sp, byte * restrict mp, int w) { - while (w--) + do { + int masa; int ma = *mp++; - int masa = fz_mul255(sp[3], ma); - int t = 255 - masa; - dp[0] = fz_mul255(sp[0], ma) + fz_mul255(dp[0], t); - dp[1] = fz_mul255(sp[1], ma) + fz_mul255(dp[1], t); - dp[2] = fz_mul255(sp[2], ma) + fz_mul255(dp[2], t); - dp[3] = fz_mul255(sp[3], ma) + fz_mul255(dp[3], t); - sp += 4; - dp += 4; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[3], ma); + masa = 255 - masa; + masa = FZ_EXPAND(masa); + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; } + while (--w); } static inline void fz_paintspanmaskN(byte * restrict dp, byte * restrict sp, byte * restrict mp, int n, int w) { - int k; while (w--) { + int k = n; + int masa; int ma = *mp++; - int masa = fz_mul255(sp[n-1], ma); - int t = 255 - masa; - for (k = 0; k < n; k++) - dp[k] = fz_mul255(sp[k], ma) + fz_mul255(dp[k], t); - sp += n; - dp += n; + ma = FZ_EXPAND(ma); + masa = FZ_COMBINE(sp[n-1], ma); + masa = 255-masa; + masa = FZ_EXPAND(masa); + do + { + *dp = FZ_COMBINE2(*sp, ma, *dp, masa); + sp++; dp++; + } + while (--k); } } @@ -201,46 +217,53 @@ fz_paintspanmask(byte * restrict dp, byte * restrict sp, byte * restrict mp, int static inline void fz_paintspan2alpha(byte * restrict dp, byte * restrict sp, int w, int alpha) { - while (w--) + alpha = FZ_EXPAND(alpha); + do { - int masa = fz_mul255(sp[1], alpha); - int t = 255 - masa; - dp[0] = fz_mul255(sp[0], masa) + fz_mul255(dp[0], t); - dp[1] = fz_mul255(sp[1], masa) + fz_mul255(dp[1], t); - sp += 2; - dp += 2; + int masa = FZ_COMBINE(sp[1], alpha); + *dp = FZ_BLEND(*sp, *dp, masa); + dp++; sp++; + *dp = FZ_BLEND(*sp, *dp, masa); + dp++; sp++; } + while (--w); } static inline void fz_paintspan4alpha(byte * restrict dp, byte * restrict sp, int w, int alpha) { - while (w--) + alpha = FZ_EXPAND(alpha); + do { - int masa = fz_mul255(sp[3], alpha); - int t = 255 - masa; - dp[0] = fz_mul255(sp[0], masa) + fz_mul255(dp[0], t); - dp[1] = fz_mul255(sp[1], masa) + fz_mul255(dp[1], t); - dp[2] = fz_mul255(sp[2], masa) + fz_mul255(dp[2], t); - dp[3] = fz_mul255(sp[3], masa) + fz_mul255(dp[3], t); - sp += 4; - dp += 4; + int masa = FZ_COMBINE(sp[3], alpha); + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; + *dp = FZ_BLEND(*sp, *dp, masa); + sp++; dp++; } + while (--w); } static inline void fz_paintspanNalpha(byte * restrict dp, byte * restrict sp, int n, int w, int alpha) { - int k; - while (w--) + alpha = FZ_EXPAND(alpha); + do { - int masa = fz_mul255(sp[n-1], alpha); - int t = 255 - masa; - for (k = 0; k < n; k++) - dp[k] = fz_mul255(sp[k], masa) + fz_mul255(dp[k], t); - sp += n; - dp += n; + int masa = FZ_COMBINE(sp[n-1], alpha); + int k = n; + do + { + *dp = FZ_BLEND(*sp++, *dp, masa); + dp++; + } + while(--k); } + while (--w); } /* Blend source over destination */ @@ -248,55 +271,62 @@ fz_paintspanNalpha(byte * restrict dp, byte * restrict sp, int n, int w, int alp static inline void fz_paintspan1(byte * restrict dp, byte * restrict sp, int w) { - while (w--) + do { - int t = 255 - sp[0]; - dp[0] = sp[0] + fz_mul255(dp[0], t); - sp ++; + int t = FZ_EXPAND(255 - sp[0]); + *dp = *sp++ + FZ_COMBINE(*dp, t); dp ++; } + while (--w); } static inline void fz_paintspan2(byte * restrict dp, byte * restrict sp, int w) { - while (w--) + do { - int t = 255 - sp[1]; - dp[0] = sp[0] + fz_mul255(dp[0], t); - dp[1] = sp[1] + fz_mul255(dp[1], t); - sp += 2; - dp += 2; + int t = FZ_EXPAND(255 - sp[1]); + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; } + while (--w); } static inline void fz_paintspan4(byte * restrict dp, byte * restrict sp, int w) { - while (w--) + do { - int t = 255 - sp[3]; - dp[0] = sp[0] + fz_mul255(dp[0], t); - dp[1] = sp[1] + fz_mul255(dp[1], t); - dp[2] = sp[2] + fz_mul255(dp[2], t); - dp[3] = sp[3] + fz_mul255(dp[3], t); - sp += 4; - dp += 4; + int t = FZ_EXPAND(255 - sp[3]); + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; } + while (--w); } static inline void fz_paintspanN(byte * restrict dp, byte * restrict sp, int n, int w) { - int k; - while (w--) + do { - int t = 255 - sp[n-1]; - for (k = 0; k < n; k++) - dp[k] = sp[k] + fz_mul255(dp[k], t); - sp += n; - dp += n; + int k = n; + int t = FZ_EXPAND(255 - sp[n-1]); + do + { + *dp = *sp++ + FZ_COMBINE(*dp, t); + dp++; + } + while (--k); } + while (--w); } void @@ -343,17 +373,20 @@ fz_paintpixmap(fz_pixmap *dst, fz_pixmap *src, int alpha) y = bbox.y0; w = bbox.x1 - bbox.x0; h = bbox.y1 - bbox.y0; + if ((w | h) == 0) + return; n = src->n; sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n; dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; - while (h--) + do { fz_paintspan(dp, sp, n, w, alpha); sp += src->w * n; dp += dst->w * n; } + while (--h); } void @@ -374,17 +407,20 @@ fz_paintpixmapmask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk) y = bbox.y0; w = bbox.x1 - bbox.x0; h = bbox.y1 - bbox.y0; + if ((w | h) == 0) + return; n = src->n; sp = src->samples + ((y - src->y) * src->w + (x - src->x)) * src->n; mp = msk->samples + ((y - msk->y) * msk->w + (x - msk->x)) * msk->n; dp = dst->samples + ((y - dst->y) * dst->w + (x - dst->x)) * dst->n; - while (h--) + do { fz_paintspanmask(dp, sp, mp, n, w); sp += src->w * n; dp += dst->w * n; mp += msk->w; } + while (--h); } -- cgit v1.2.3