diff options
Diffstat (limited to 'render/render.c')
-rw-r--r-- | render/render.c | 82 |
1 files changed, 33 insertions, 49 deletions
diff --git a/render/render.c b/render/render.c index 1798e011..9c28e689 100644 --- a/render/render.c +++ b/render/render.c @@ -72,8 +72,9 @@ fz_error * fz_rendercolor(fz_renderer *gc, fz_colornode *color, fz_matrix ctm) { fz_error *error; - int x, y; + int x, y, w, h; float rgb[3]; + unsigned char *p; printf("render color\n"); @@ -84,11 +85,16 @@ printf("render color\n"); gc->g = rgb[1] * 255; gc->b = rgb[2] * 255; - error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, 4); + x = gc->clip.min.x; + y = gc->clip.min.y; + w = gc->clip.max.x - gc->clip.min.x; + h = gc->clip.max.y - gc->clip.min.y; + + error = fz_newpixmap(&gc->tmp, x, y, w, h, 4); if (error) return error; - unsigned char *p = gc->tmp->samples; + p = gc->tmp->samples; for (y = 0; y < gc->tmp->h; y++) { @@ -123,10 +129,7 @@ fz_renderoverchild(fz_renderer *gc, fz_node *node, fz_matrix ctm) if (gc->tmp) { -//printf("over src ");fz_debugpixmap(gc->tmp);getchar(); -//printf("over dst ");fz_debugpixmap(gc->acc);getchar(); fz_blendover(gc->tmp, gc->acc); -//printf("over res ");fz_debugpixmap(gc->acc);getchar(); fz_droppixmap(gc->tmp); gc->tmp = nil; } @@ -141,14 +144,17 @@ fz_renderover(fz_renderer *gc, fz_overnode *over, fz_matrix ctm) fz_pixmap *oldacc = nil; int oldmode; -//printf("begin over\n"); + 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; /* uh-oh! we have a new over cluster */ if (gc->mode != FZ_ROVER) { printf("begin over accumulator\n"); oldacc = gc->acc; - error = fz_newpixmap(&gc->acc, gc->x, gc->y, gc->w, gc->h, gc->model ? 4 : 1); + error = fz_newpixmap(&gc->acc, x, y, w, h, gc->model ? 4 : 1); if (error) return error; fz_clearpixmap(gc->acc); @@ -176,8 +182,6 @@ printf("end over accumulator\n"); gc->acc = oldacc; } -//printf("end over\n"); - return nil; } @@ -191,8 +195,9 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm) fz_node *color; fz_node *shape; int oldmode; - fz_rect bbox; - int ox, oy, ow, oh; + fz_irect newclip; + fz_irect oldclip; + int x, y, w, h; color = mask->super.child; shape = color->next; @@ -211,25 +216,15 @@ printf("begin mask\n"); oldacc = gc->acc; oldmode = gc->mode; - gc->acc = nil; - gc->mode = FZ_RMASK; - - // TODO: set clip bbox to that of shape + oldclip = gc->clip; - bbox = fz_boundnode(shape, ctm); - bbox = fz_intersectrects(bbox, (fz_rect){{gc->x,gc->y},{gc->x+gc->w,gc->y+gc->h}}); - printf("mask bbox [%g %g %g %g]\n", bbox.min.x, bbox.min.y, bbox.max.x, bbox.max.y); - ox = gc->x; - oy = gc->y; - ow = gc->w; - oh = gc->h; + 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->x = fz_floor(bbox.min.x) - 1; - gc->y = fz_floor(bbox.min.y) - 1; - gc->w = fz_ceil(bbox.max.x) - fz_floor(bbox.min.x) + 1; - gc->h = fz_ceil(bbox.max.y) - fz_floor(bbox.min.y) + 1; - ctm.e -= bbox.min.x - fz_floor(bbox.min.x); - ctm.f -= bbox.min.y - fz_floor(bbox.min.y); + gc->acc = nil; + gc->mode = FZ_RMASK; + gc->clip = newclip; gc->tmp = nil; error = fz_rendernode(gc, color, ctm); @@ -245,26 +240,23 @@ printf("begin mask\n"); if (!shapepix) return nil; - error = fz_newpixmap(&gc->tmp, gc->x, gc->y, gc->w, gc->h, colorpix->n); + x = gc->clip.min.x; + y = gc->clip.min.y; + w = gc->clip.max.x - gc->clip.min.x; + h = gc->clip.max.y - gc->clip.min.y; + + error = fz_newpixmap(&gc->tmp, x, y, w, h, colorpix->n); if (error) return error; fz_blendmask(gc->tmp, colorpix, shapepix); -//printf("mask color");fz_debugpixmap(colorpix);getchar(); -//printf("mask shape");fz_debugpixmap(shapepix);getchar(); -//printf("mask blend");fz_debugpixmap(gc->tmp);getchar(); - fz_droppixmap(shapepix); fz_droppixmap(colorpix); gc->acc = oldacc; gc->mode = oldmode; - - gc->x = ox; - gc->y = oy; - gc->w = ow; - gc->h = oh; + gc->clip = oldclip; printf("end mask\n"); @@ -274,7 +266,6 @@ printf("end mask\n"); fz_error * fz_rendertransform(fz_renderer *gc, fz_transformnode *transform, fz_matrix ctm) { -//printf("render transform\n"); ctm = fz_concat(transform->m, ctm); return fz_rendernode(gc, transform->super.child, ctm); } @@ -311,18 +302,11 @@ fz_rendernode(fz_renderer *gc, fz_node *node, fz_matrix ctm) } fz_error * -fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, fz_rect bbox) +fz_rendertree(fz_pixmap **outp, fz_renderer *gc, fz_tree *tree, fz_matrix ctm, fz_irect bbox) { fz_error *error; - gc->x = fz_floor(bbox.min.x); - gc->y = fz_floor(bbox.min.y); - gc->w = fz_ceil(bbox.max.x) - fz_floor(bbox.min.x); - gc->h = fz_ceil(bbox.max.y) - fz_floor(bbox.min.y); - - /* compensate for rounding */ - ctm.e -= bbox.min.x - gc->x; - ctm.f -= bbox.min.y - gc->y; + gc->clip = bbox; printf("render tree\n"); |