summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--raster/porterduff.c2
-rw-r--r--raster/render.c23
2 files changed, 18 insertions, 7 deletions
diff --git a/raster/porterduff.c b/raster/porterduff.c
index fdc42951..0521362e 100644
--- a/raster/porterduff.c
+++ b/raster/porterduff.c
@@ -270,7 +270,7 @@ static void path_w3i1o4(byte * restrict argb, byte * restrict src, int cov, int
cov += *src; *src = 0; src++;
a = fz_mul255(cov, ca);
ssa = 255 - a;
- dst[0] = cov + fz_mul255(dst[0], ssa);
+ dst[0] = a + fz_mul255(dst[0], ssa);
dst[1] = rgb0 + fz_mul255((short)dst[1] - rgb0, ssa);
dst[2] = rgb1 + fz_mul255((short)dst[2] - rgb1, ssa);
dst[3] = rgb2 + fz_mul255((short)dst[3] - rgb2, ssa);
diff --git a/raster/render.c b/raster/render.c
index e3caadce..9f39056a 100644
--- a/raster/render.c
+++ b/raster/render.c
@@ -117,9 +117,9 @@ rendersolid(fz_renderer *gc, fz_solidnode *solid, fz_matrix ctm)
fz_convertcolor(solid->cs, solid->samples, gc->model, rgb);
gc->argb[0] = solid->a * 255;
- gc->argb[1] = rgb[0] * 255;
- gc->argb[2] = rgb[1] * 255;
- gc->argb[3] = rgb[2] * 255;
+ gc->argb[1] = rgb[0] * solid->a * 255;
+ gc->argb[2] = rgb[1] * solid->a * 255;
+ gc->argb[3] = rgb[2] * solid->a * 255;
DEBUG("solid %s [%d %d %d %d];\n", solid->cs->name, gc->argb[0], gc->argb[1], gc->argb[2], gc->argb[3]);
@@ -141,6 +141,7 @@ DEBUG("solid %s [%d %d %d %d];\n", solid->cs->name, gc->argb[0], gc->argb[1], gc
r = gc->argb[1];
g = gc->argb[2];
b = gc->argb[3];
+ if (((unsigned)p & 3)) {
while (n--)
{
p[0] = a;
@@ -149,6 +150,16 @@ DEBUG("solid %s [%d %d %d %d];\n", solid->cs->name, gc->argb[0], gc->argb[1], gc
p[3] = b;
p += 4;
}
+ }
+ else
+ {
+ unsigned *pw = (unsigned *)p;
+ unsigned argb = (a << 24) | (r << 16) | (g << 8) | b;
+ while (n--)
+ {
+ *pw++ = argb;
+ }
+ }
return nil;
}
@@ -717,9 +728,9 @@ rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm)
fz_convertcolor(solid->cs, solid->samples, gc->model, rgb);
gc->argb[0] = solid->a * 255;
- gc->argb[1] = rgb[0] * 255;
- gc->argb[2] = rgb[1] * 255;
- gc->argb[3] = rgb[2] * 255;
+ gc->argb[1] = rgb[0] * solid->a * 255;
+ gc->argb[2] = rgb[1] * solid->a * 255;
+ gc->argb[3] = rgb[2] * solid->a * 255;
gc->flag |= FRGB;
/* we know these can handle the FRGB shortcut */