summaryrefslogtreecommitdiff
path: root/draw
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-10-13 12:42:54 +0000
committerTor Andersson <tor@ghostscript.com>2010-10-13 12:42:54 +0000
commit64b1c2c0b9d01abe4b37cca8929588875e6ba474 (patch)
treed60ae7c01d19e16d9e06f1059f1a612a6495d433 /draw
parent9207d8ae87fd98fe0628126f97f214db2b4a90af (diff)
downloadmupdf-64b1c2c0b9d01abe4b37cca8929588875e6ba474.tar.xz
Use EXPAND/BLEND/COMBINE macros for more plotting functions. Patch by Robin Watts.
Diffstat (limited to 'draw')
-rw-r--r--draw/porterduff.c208
1 files changed, 122 insertions, 86 deletions
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);
}