summaryrefslogtreecommitdiff
path: root/raster/render.c
diff options
context:
space:
mode:
authorGlenn Kennard <glenn.kennard@gmail.com>2008-03-21 02:34:47 +0100
committerGlenn Kennard <glenn.kennard@gmail.com>2008-03-21 02:34:47 +0100
commit3e9200955bf75860835f1499fa699d2c0460cbcb (patch)
tree919eda547fa4e8bc5d38f88f96437b42dcbdf98d /raster/render.c
parent783f538d4ee8e87bfd911345c903052b29b92338 (diff)
downloadmupdf-3e9200955bf75860835f1499fa699d2c0460cbcb.tar.xz
Yup, premul alpha. Also, vectorize rendersolid.
Diffstat (limited to 'raster/render.c')
-rw-r--r--raster/render.c23
1 files changed, 17 insertions, 6 deletions
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 */