summaryrefslogtreecommitdiff
path: root/render/render.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-11-16 10:46:23 +0100
committerTor Andersson <tor@ghostscript.com>2004-11-16 10:46:23 +0100
commitd4de3f89649314eb58f779763ee99b62688ff3ec (patch)
tree21d81bbe5a49df69c428e4e35b242e0ff07e27d8 /render/render.c
parent3b425b8bf0c58e25da576ed86496171ea19240f9 (diff)
downloadmupdf-d4de3f89649314eb58f779763ee99b62688ff3ec.tar.xz
changed order of child nodes in over/mask
Diffstat (limited to 'render/render.c')
-rw-r--r--render/render.c100
1 files changed, 28 insertions, 72 deletions
diff --git a/render/render.c b/render/render.c
index 9c28e689..63165813 100644
--- a/render/render.c
+++ b/render/render.c
@@ -22,7 +22,6 @@ fz_newrenderer(fz_renderer **gcp, fz_colorspace *processcolormodel, int gcmem)
gc->cache = nil;
gc->gel = nil;
gc->ael = nil;
- gc->mode = FZ_RNONE;
gc->tmp = nil;
gc->acc = nil;
@@ -76,8 +75,6 @@ fz_rendercolor(fz_renderer *gc, fz_colornode *color, fz_matrix ctm)
float rgb[3];
unsigned char *p;
-printf("render color\n");
-
assert(gc->model);
fz_convertcolor(color->cs, color->samples, gc->model, rgb);
@@ -110,76 +107,47 @@ printf("render color\n");
return nil;
}
-static fz_error *
-fz_renderoverchild(fz_renderer *gc, fz_node *node, fz_matrix ctm)
-{
- fz_error *error;
-
- if (node->next)
- {
- error = fz_renderoverchild(gc, node->next, ctm);
- if (error)
- return error;
- }
-
- gc->tmp = nil;
- error = fz_rendernode(gc, node, ctm);
- if (error)
- return error;
-
- if (gc->tmp)
- {
- fz_blendover(gc->tmp, gc->acc);
- fz_droppixmap(gc->tmp);
- gc->tmp = nil;
- }
-
- return nil;
-}
-
fz_error *
fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm)
{
fz_error *error;
- fz_pixmap *oldacc = nil;
- int oldmode;
-
- int x = gc->clip.min.x;
- int y = gc->clip.min.y;
- int w = gc->clip.max.x - gc->clip.min.x;
- int h = gc->clip.max.y - gc->clip.min.y;
+ fz_node *child;
+ int cluster = 0;;
- /* uh-oh! we have a new over cluster */
- if (gc->mode != FZ_ROVER)
+ if (!gc->acc)
{
-printf("begin over accumulator\n");
- oldacc = gc->acc;
+ int x = gc->clip.min.x;
+ int y = gc->clip.min.y;
+ int w = gc->clip.max.x - gc->clip.min.x;
+ int h = gc->clip.max.y - gc->clip.min.y;
+
error = fz_newpixmap(&gc->acc, x, y, w, h, gc->model ? 4 : 1);
if (error)
return error;
- fz_clearpixmap(gc->acc);
- }
- oldmode = gc->mode;
- gc->mode = FZ_ROVER;
+ fz_clearpixmap(gc->acc);
- gc->tmp = nil;
+ cluster = 1;
+ }
- if (over->super.child)
+ for (child = over->super.first; child; child = child->next)
{
- error = fz_renderoverchild(gc, over->super.child, ctm);
+ error = fz_rendernode(gc, child, ctm);
if (error)
return error;
- }
- gc->mode = oldmode;
+ if (gc->tmp)
+ {
+ fz_blendover(gc->tmp, gc->acc);
+ fz_droppixmap(gc->tmp);
+ gc->tmp = nil;
+ }
+ }
- /* uh-oh! end of over cluster */
- if (gc->mode != FZ_ROVER)
+ if (cluster)
{
-printf("end over accumulator\n");
gc->tmp = gc->acc;
- gc->acc = oldacc;
+ gc->acc = nil;
}
return nil;
@@ -194,15 +162,14 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm)
fz_pixmap *shapepix;
fz_node *color;
fz_node *shape;
- int oldmode;
fz_irect newclip;
fz_irect oldclip;
int x, y, w, h;
- color = mask->super.child;
- shape = color->next;
+ shape = mask->super.first;
+ color = shape->next;
- if (gc->mode == FZ_ROVER)
+ if (gc->acc)
{
if (fz_ispathnode(shape) && fz_iscolornode(color))
return fz_rendercolorpath(gc, (fz_pathnode*)shape, (fz_colornode*)color, ctm);
@@ -212,18 +179,12 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm)
puts("could optimize image mask!");
}
-printf("begin mask\n");
-
oldacc = gc->acc;
- oldmode = gc->mode;
oldclip = gc->clip;
-
newclip = fz_roundrect(fz_boundnode(shape, ctm));
newclip = fz_intersectirects(newclip, gc->clip);
- printf("mask bbox [%d %d %d %d]\n", newclip.min.x, newclip.min.y, newclip.max.x, newclip.max.y);
gc->acc = nil;
- gc->mode = FZ_RMASK;
gc->clip = newclip;
gc->tmp = nil;
@@ -238,8 +199,6 @@ printf("begin mask\n");
return error;
shapepix = gc->tmp;
-if (!shapepix) return nil;
-
x = gc->clip.min.x;
y = gc->clip.min.y;
w = gc->clip.max.x - gc->clip.min.x;
@@ -249,17 +208,16 @@ if (!shapepix) return nil;
if (error)
return error;
+ fz_clearpixmap(gc->tmp);
+
fz_blendmask(gc->tmp, colorpix, shapepix);
fz_droppixmap(shapepix);
fz_droppixmap(colorpix);
gc->acc = oldacc;
- gc->mode = oldmode;
gc->clip = oldclip;
-printf("end mask\n");
-
return nil;
}
@@ -267,7 +225,7 @@ fz_error *
fz_rendertransform(fz_renderer *gc, fz_transformnode *transform, fz_matrix ctm)
{
ctm = fz_concat(transform->m, ctm);
- return fz_rendernode(gc, transform->super.child, ctm);
+ return fz_rendernode(gc, transform->super.first, ctm);
}
fz_error *
@@ -308,8 +266,6 @@ fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, f
gc->clip = bbox;
-printf("render tree\n");
-
error = fz_rendernode(gc, tree->root, ctm);
if (error)
return error;