summaryrefslogtreecommitdiff
path: root/pdf
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-12-19 15:19:40 +0000
committerRobin Watts <robin.watts@artifex.com>2011-12-19 15:19:40 +0000
commit3028fbf00d2d571b6f67001b5c09c15e3e2cfa26 (patch)
tree7be7037d3a0c4d093d1861a15cae812ae8377d54 /pdf
parentda81dc0f28246b37a487e8ace9443f2689f855c0 (diff)
downloadmupdf-3028fbf00d2d571b6f67001b5c09c15e3e2cfa26.tar.xz
More Memory squeezing fixes
Diffstat (limited to 'pdf')
-rw-r--r--pdf/pdf_colorspace.c101
-rw-r--r--pdf/pdf_image.c3
-rw-r--r--pdf/pdf_interpret.c105
3 files changed, 127 insertions, 82 deletions
diff --git a/pdf/pdf_colorspace.c b/pdf/pdf_colorspace.c
index 9d2f87ed..b2f42b8f 100644
--- a/pdf/pdf_colorspace.c
+++ b/pdf/pdf_colorspace.c
@@ -220,63 +220,82 @@ pdf_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src)
static fz_colorspace *
load_indexed(pdf_xref *xref, fz_obj *array)
{
- struct indexed *idx;
+ struct indexed *idx = NULL;
fz_context *ctx = xref->ctx;
fz_obj *baseobj = fz_array_get(array, 1);
fz_obj *highobj = fz_array_get(array, 2);
fz_obj *lookup = fz_array_get(array, 3);
- fz_colorspace *base, *cs;
+ fz_colorspace *base = NULL;
+ fz_colorspace *cs = NULL;
int i, n;
- base = pdf_load_colorspace(xref, baseobj);
- /* "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj) */
-
- idx = fz_malloc_struct(ctx, struct indexed);
- idx->base = base;
- idx->high = fz_to_int(highobj);
- idx->high = CLAMP(idx->high, 0, 255);
- n = base->n * (idx->high + 1);
- idx->lookup = fz_malloc_array(ctx, 1, n);
-
- cs = fz_new_colorspace(ctx, "Indexed", 1);
- cs->to_rgb = indexed_to_rgb;
- cs->free_data = free_indexed;
- cs->data = idx;
- cs->size += sizeof(*idx) + n + (base ? base->size : 0);
-
- if (fz_is_string(lookup) && fz_to_str_len(lookup) == n)
- {
- unsigned char *buf = (unsigned char *) fz_to_str_buf(lookup);
- for (i = 0; i < n; i++)
- idx->lookup[i] = buf[i];
- }
- else if (fz_is_indirect(lookup))
- {
- fz_stream *file;
+ fz_var(idx);
+ fz_var(base);
+ fz_var(cs);
- fz_try(ctx)
+ fz_try(ctx)
+ {
+ base = pdf_load_colorspace(xref, baseobj);
+ /* "cannot load base colorspace (%d %d R)", fz_to_num(baseobj), fz_to_gen(baseobj) */
+
+ idx = fz_malloc_struct(ctx, struct indexed);
+ idx->lookup = NULL;
+ idx->base = base;
+ idx->high = fz_to_int(highobj);
+ idx->high = CLAMP(idx->high, 0, 255);
+ n = base->n * (idx->high + 1);
+ idx->lookup = fz_malloc_array(ctx, 1, n);
+
+ cs = fz_new_colorspace(ctx, "Indexed", 1);
+ cs->to_rgb = indexed_to_rgb;
+ cs->free_data = free_indexed;
+ cs->data = idx;
+ cs->size += sizeof(*idx) + n + (base ? base->size : 0);
+
+ if (fz_is_string(lookup) && fz_to_str_len(lookup) == n)
{
- file = pdf_open_stream(xref, fz_to_num(lookup), fz_to_gen(lookup));
+ unsigned char *buf = (unsigned char *) fz_to_str_buf(lookup);
+ for (i = 0; i < n; i++)
+ idx->lookup[i] = buf[i];
}
- fz_catch(ctx)
+ else if (fz_is_indirect(lookup))
{
- fz_drop_colorspace(ctx, cs);
- fz_throw(ctx, "cannot open colorspace lookup table (%d 0 R)", fz_to_num(lookup));
- }
+ fz_stream *file = NULL;
+
+ fz_try(ctx)
+ {
+ file = pdf_open_stream(xref, fz_to_num(lookup), fz_to_gen(lookup));
+ }
+ fz_catch(ctx)
+ {
+ fz_throw(ctx, "cannot open colorspace lookup table (%d 0 R)", fz_to_num(lookup));
+ }
+
+ i = fz_read(file, idx->lookup, n);
+ if (i < 0)
+ {
+ fz_close(file);
+ fz_throw(ctx, "cannot read colorspace lookup table (%d 0 R)", fz_to_num(lookup));
+ }
- i = fz_read(file, idx->lookup, n);
- if (i < 0)
+ fz_close(file);
+ }
+ else
{
- fz_drop_colorspace(ctx, cs);
- fz_throw(ctx, "cannot read colorspace lookup table (%d 0 R)", fz_to_num(lookup));
+ fz_throw(ctx, "cannot parse colorspace lookup table");
}
-
- fz_close(file);
}
- else
+ fz_catch(ctx)
{
+ if (cs == NULL || cs->data != idx)
+ {
+ fz_drop_colorspace(ctx, base);
+ if (idx)
+ fz_free(ctx, idx->lookup);
+ fz_free(ctx, idx);
+ }
fz_drop_colorspace(ctx, cs);
- fz_throw(ctx, "cannot parse colorspace lookup table");
+ fz_rethrow(ctx);
}
return cs;
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c
index ead5c365..db2c6cc4 100644
--- a/pdf/pdf_image.c
+++ b/pdf/pdf_image.c
@@ -166,7 +166,8 @@ pdf_load_image_imp(pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_stream *cstm, i
}
fz_catch(ctx)
{
- fz_throw(ctx, "out of memory");
+ fz_drop_colorspace(ctx, colorspace);
+ fz_rethrow(ctx);
}
if (colorspace)
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index 0d5e2aa2..7fce1d52 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -1266,6 +1266,7 @@ pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix tr
fz_matrix oldtopctm;
int oldtop;
int popmask;
+ int caught = 0;
pdf_gsave(csi);
@@ -1277,55 +1278,62 @@ pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix tr
transform = fz_concat(xobj->matrix, transform);
gstate->ctm = fz_concat(transform, gstate->ctm);
- /* apply soft mask, create transparency group and reset state */
- if (xobj->transparency)
+ fz_try(ctx)
{
- if (gstate->softmask)
+ /* apply soft mask, create transparency group and reset state */
+ if (xobj->transparency)
{
- pdf_xobject *softmask = gstate->softmask;
- fz_rect bbox = fz_transform_rect(gstate->ctm, xobj->bbox);
+ if (gstate->softmask)
+ {
+ pdf_xobject *softmask = gstate->softmask;
+ fz_rect bbox = fz_transform_rect(gstate->ctm, xobj->bbox);
- gstate->softmask = NULL;
- popmask = 1;
+ gstate->softmask = NULL;
+ popmask = 1;
- fz_begin_mask(csi->dev, bbox, gstate->luminosity,
- softmask->colorspace, gstate->softmask_bc);
- pdf_run_xobject(csi, resources, softmask, fz_identity);
- /* RJW: "cannot run softmask" */
- fz_end_mask(csi->dev);
+ fz_begin_mask(csi->dev, bbox, gstate->luminosity,
+ softmask->colorspace, gstate->softmask_bc);
+ pdf_run_xobject(csi, resources, softmask, fz_identity);
+ /* RJW: "cannot run softmask" */
+ fz_end_mask(csi->dev);
- pdf_drop_xobject(ctx, softmask);
- }
+ pdf_drop_xobject(ctx, softmask);
+ }
- fz_begin_group(csi->dev,
- fz_transform_rect(gstate->ctm, xobj->bbox),
- xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha);
+ fz_begin_group(csi->dev,
+ fz_transform_rect(gstate->ctm, xobj->bbox),
+ xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha);
- gstate->blendmode = 0;
- gstate->stroke.alpha = 1;
- gstate->fill.alpha = 1;
- }
+ gstate->blendmode = 0;
+ gstate->stroke.alpha = 1;
+ gstate->fill.alpha = 1;
+ }
- /* clip to the bounds */
+ /* clip to the bounds */
- fz_moveto(ctx, csi->path, xobj->bbox.x0, xobj->bbox.y0);
- fz_lineto(ctx, csi->path, xobj->bbox.x1, xobj->bbox.y0);
- fz_lineto(ctx, csi->path, xobj->bbox.x1, xobj->bbox.y1);
- fz_lineto(ctx, csi->path, xobj->bbox.x0, xobj->bbox.y1);
- fz_closepath(ctx, csi->path);
- csi->clip = 1;
- pdf_show_path(csi, 0, 0, 0, 0);
+ fz_moveto(ctx, csi->path, xobj->bbox.x0, xobj->bbox.y0);
+ fz_lineto(ctx, csi->path, xobj->bbox.x1, xobj->bbox.y0);
+ fz_lineto(ctx, csi->path, xobj->bbox.x1, xobj->bbox.y1);
+ fz_lineto(ctx, csi->path, xobj->bbox.x0, xobj->bbox.y1);
+ fz_closepath(ctx, csi->path);
+ csi->clip = 1;
+ pdf_show_path(csi, 0, 0, 0, 0);
- /* run contents */
+ /* run contents */
- oldtopctm = csi->top_ctm;
- csi->top_ctm = gstate->ctm;
+ oldtopctm = csi->top_ctm;
+ csi->top_ctm = gstate->ctm;
- if (xobj->resources)
- resources = xobj->resources;
+ if (xobj->resources)
+ resources = xobj->resources;
- pdf_run_buffer(csi, resources, xobj->contents);
- /* RJW: "cannot interpret XObject stream" */
+ pdf_run_buffer(csi, resources, xobj->contents);
+ /* RJW: "cannot interpret XObject stream" */
+ }
+ fz_catch(ctx)
+ {
+ caught = 1;
+ }
csi->top_ctm = oldtopctm;
@@ -1334,8 +1342,10 @@ pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix tr
pdf_grestore(csi);
- /* wrap up transparency stacks */
+ if (caught)
+ fz_rethrow(ctx);
+ /* wrap up transparency stacks */
if (xobj->transparency)
{
fz_end_group(csi->dev);
@@ -1671,8 +1681,15 @@ static void pdf_run_Do(pdf_csi *csi, fz_obj *rdb)
if (!xobj->resources)
xobj->resources = fz_keep_obj(rdb);
- pdf_run_xobject(csi, xobj->resources, xobj, fz_identity);
- /* RJW: "cannot draw xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj) */
+ fz_try(ctx)
+ {
+ pdf_run_xobject(csi, xobj->resources, xobj, fz_identity);
+ }
+ fz_catch(ctx)
+ {
+ pdf_drop_xobject(ctx, xobj);
+ fz_throw(ctx, "cannot draw xobject (%d %d R)", fz_to_num(obj), fz_to_gen(obj));
+ }
pdf_drop_xobject(ctx, xobj);
}
@@ -1684,7 +1701,15 @@ static void pdf_run_Do(pdf_csi *csi, fz_obj *rdb)
fz_pixmap *img;
img = pdf_load_image(csi->xref, obj);
/* RJW: "cannot load image (%d %d R)", fz_to_num(obj), fz_to_gen(obj) */
- pdf_show_image(csi, img);
+ fz_try(ctx)
+ {
+ pdf_show_image(csi, img);
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_pixmap(ctx, img);
+ fz_rethrow(ctx);
+ }
fz_drop_pixmap(ctx, img);
}
}