summaryrefslogtreecommitdiff
path: root/render/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'render/render.c')
-rw-r--r--render/render.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/render/render.c b/render/render.c
index ad42bdbe..1798e011 100644
--- a/render/render.c
+++ b/render/render.c
@@ -9,7 +9,7 @@ fz_error *fz_renderimageover(fz_renderer*, fz_imagenode*, fz_matrix);
fz_error *fz_renderimage(fz_renderer*, fz_imagenode*, fz_matrix);
fz_error *
-fz_newrenderer(fz_renderer **gcp, fz_colorspace *processcolormodel)
+fz_newrenderer(fz_renderer **gcp, fz_colorspace *processcolormodel, int gcmem)
{
fz_error *error;
fz_renderer *gc;
@@ -26,7 +26,7 @@ fz_newrenderer(fz_renderer **gcp, fz_colorspace *processcolormodel)
gc->tmp = nil;
gc->acc = nil;
- error = fz_newglyphcache(&gc->cache, 4096, 256 * 1024);
+ error = fz_newglyphcache(&gc->cache, gcmem / 32, gcmem);
if (error)
goto cleanup;
@@ -191,6 +191,8 @@ 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;
color = mask->super.child;
shape = color->next;
@@ -201,6 +203,8 @@ fz_rendermask(fz_renderer *gc, fz_masknode *mask, fz_matrix ctm)
return fz_rendercolorpath(gc, (fz_pathnode*)shape, (fz_colornode*)color, ctm);
if (fz_istextnode(shape) && fz_iscolornode(color))
return fz_rendercolortext(gc, (fz_textnode*)shape, (fz_colornode*)color, ctm);
+ if (fz_isimagenode(shape) && fz_iscolornode(color))
+ puts("could optimize image mask!");
}
printf("begin mask\n");
@@ -210,6 +214,23 @@ printf("begin mask\n");
gc->acc = nil;
gc->mode = FZ_RMASK;
+ // TODO: set clip bbox to that of shape
+
+ 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;
+
+ 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->tmp = nil;
error = fz_rendernode(gc, color, ctm);
if (error)
@@ -240,6 +261,11 @@ if (!shapepix) return nil;
gc->acc = oldacc;
gc->mode = oldmode;
+ gc->x = ox;
+ gc->y = oy;
+ gc->w = ow;
+ gc->h = oh;
+
printf("end mask\n");
return nil;