diff options
author | Robin Watts <robin.watts@artifex.com> | 2011-12-19 15:19:40 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2011-12-19 15:19:40 +0000 |
commit | 3028fbf00d2d571b6f67001b5c09c15e3e2cfa26 (patch) | |
tree | 7be7037d3a0c4d093d1861a15cae812ae8377d54 /pdf | |
parent | da81dc0f28246b37a487e8ace9443f2689f855c0 (diff) | |
download | mupdf-3028fbf00d2d571b6f67001b5c09c15e3e2cfa26.tar.xz |
More Memory squeezing fixes
Diffstat (limited to 'pdf')
-rw-r--r-- | pdf/pdf_colorspace.c | 101 | ||||
-rw-r--r-- | pdf/pdf_image.c | 3 | ||||
-rw-r--r-- | pdf/pdf_interpret.c | 105 |
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); } } |