diff options
author | Robin Watts <robin.watts@artifex.com> | 2011-09-14 17:36:57 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2011-09-15 14:50:17 +0100 |
commit | b51ef0eea028c73b6379e832eaa34fff3fbbb927 (patch) | |
tree | 1ab685ccd356e7fdc832b2e3322c0486b2670cfb /pdf/pdf_image.c | |
parent | 89ae81f651bfa112b8e07317eb6983beaf7cb212 (diff) | |
download | mupdf-b51ef0eea028c73b6379e832eaa34fff3fbbb927.tar.xz |
Add context to mupdf.
Huge pervasive change to lots of files, adding a context for exception
handling and allocation.
In time we'll move more statics into there.
Also fix some for(i = 0; i < function(...); i++) calls.
Diffstat (limited to 'pdf/pdf_image.c')
-rw-r--r-- | pdf/pdf_image.c | 98 |
1 files changed, 51 insertions, 47 deletions
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c index 413efc98..95f26c31 100644 --- a/pdf/pdf_image.c +++ b/pdf/pdf_image.c @@ -46,9 +46,10 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, int stride; unsigned char *samples; int i, len; + fz_context *ctx = xref->ctx; /* special case for JPEG2000 images */ - if (pdf_is_jpx_image(dict)) + if (pdf_is_jpx_image(ctx, dict)) { tile = NULL; error = pdf_load_jpx_image(&tile, xref, dict); @@ -58,11 +59,11 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, { if (tile->n != 2) { - fz_drop_pixmap(tile); + fz_drop_pixmap(ctx, tile); return fz_error_make("softmask must be grayscale"); } - mask = fz_alpha_from_gray(tile, 1); - fz_drop_pixmap(tile); + mask = fz_alpha_from_gray(ctx, tile, 1); + fz_drop_pixmap(ctx, tile); *imgp = mask; return fz_okay; } @@ -70,11 +71,11 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, return fz_okay; } - w = fz_to_int(fz_dict_getsa(dict, "Width", "W")); - h = fz_to_int(fz_dict_getsa(dict, "Height", "H")); - bpc = fz_to_int(fz_dict_getsa(dict, "BitsPerComponent", "BPC")); - imagemask = fz_to_bool(fz_dict_getsa(dict, "ImageMask", "IM")); - interpolate = fz_to_bool(fz_dict_getsa(dict, "Interpolate", "I")); + w = fz_to_int(ctx, fz_dict_getsa(ctx, dict, "Width", "W")); + h = fz_to_int(ctx, fz_dict_getsa(ctx, dict, "Height", "H")); + bpc = fz_to_int(ctx, fz_dict_getsa(ctx, dict, "BitsPerComponent", "BPC")); + imagemask = fz_to_bool(ctx, fz_dict_getsa(ctx, dict, "ImageMask", "IM")); + interpolate = fz_to_bool(ctx, fz_dict_getsa(ctx, dict, "Interpolate", "I")); indexed = 0; usecolorkey = 0; @@ -97,13 +98,13 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, if (h > (1 << 16)) return fz_error_make("image is too high"); - obj = fz_dict_getsa(dict, "ColorSpace", "CS"); + obj = fz_dict_getsa(ctx, dict, "ColorSpace", "CS"); if (obj && !imagemask && !forcemask) { /* colorspace resource lookup is only done for inline images */ - if (fz_is_name(obj)) + if (fz_is_name(ctx, obj)) { - res = fz_dict_get(fz_dict_gets(rdb, "ColorSpace"), obj); + res = fz_dict_get(ctx, fz_dict_gets(ctx, rdb, "ColorSpace"), obj); if (res) obj = res; } @@ -122,11 +123,11 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, n = 1; } - obj = fz_dict_getsa(dict, "Decode", "D"); + obj = fz_dict_getsa(ctx, dict, "Decode", "D"); if (obj) { for (i = 0; i < n * 2; i++) - decode[i] = fz_to_real(fz_array_get(obj, i)); + decode[i] = fz_to_real(ctx, fz_array_get(ctx, obj, i)); } else { @@ -135,8 +136,8 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, decode[i] = i & 1 ? maxval : 0; } - obj = fz_dict_getsa(dict, "SMask", "Mask"); - if (fz_is_dict(obj)) + obj = fz_dict_getsa(ctx, dict, "SMask", "Mask"); + if (fz_is_dict(ctx, obj)) { /* Not allowed for inline images */ if (!cstm) @@ -145,31 +146,31 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, if (error) { if (colorspace) - fz_drop_colorspace(colorspace); + fz_drop_colorspace(ctx, colorspace); return fz_error_note(error, "cannot load image mask/softmask"); } } } - else if (fz_is_array(obj)) + else if (fz_is_array(ctx, obj)) { usecolorkey = 1; for (i = 0; i < n * 2; i++) - colorkey[i] = fz_to_int(fz_array_get(obj, i)); + colorkey[i] = fz_to_int(ctx, fz_array_get(ctx, obj, i)); } /* Allocate now, to fail early if we run out of memory */ - tile = fz_new_pixmap_with_limit(colorspace, w, h); + tile = fz_new_pixmap_with_limit(ctx, colorspace, w, h); if (!tile) { if (colorspace) - fz_drop_colorspace(colorspace); + fz_drop_colorspace(ctx, colorspace); if (mask) - fz_drop_pixmap(mask); + fz_drop_pixmap(ctx, mask); return fz_error_make("out of memory"); } if (colorspace) - fz_drop_colorspace(colorspace); + fz_drop_colorspace(ctx, colorspace); tile->mask = mask; tile->interpolate = interpolate; @@ -185,19 +186,19 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, error = pdf_open_stream(&stm, xref, fz_to_num(dict), fz_to_gen(dict)); if (error) { - fz_drop_pixmap(tile); + fz_drop_pixmap(ctx, tile); return fz_error_note(error, "cannot open image data stream (%d 0 R)", fz_to_num(dict)); } } - samples = fz_calloc(h, stride); + samples = fz_calloc(ctx, h, stride); len = fz_read(stm, samples, h * stride); if (len < 0) { fz_close(stm); - fz_free(samples); - fz_drop_pixmap(tile); + fz_free(ctx, samples); + fz_drop_pixmap(ctx, tile); return fz_error_note(len, "cannot read image data"); } @@ -233,7 +234,7 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, fz_unpack_tile(tile, samples, n, bpc, stride, indexed); - fz_free(samples); + fz_free(ctx, samples); if (usecolorkey) pdf_mask_color_key(tile, n, colorkey); @@ -242,8 +243,8 @@ pdf_load_image_imp(fz_pixmap **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict, { fz_pixmap *conv; fz_decode_indexed_tile(tile, decode, (1 << bpc) - 1); - conv = pdf_expand_indexed_pixmap(tile); - fz_drop_pixmap(tile); + conv = pdf_expand_indexed_pixmap(ctx, tile); + fz_drop_pixmap(ctx, tile); tile = conv; } else @@ -268,16 +269,17 @@ pdf_load_inline_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *rdb, fz_obj *dic } int -pdf_is_jpx_image(fz_obj *dict) +pdf_is_jpx_image(fz_context *ctx, fz_obj *dict) { fz_obj *filter; - int i; + int i, n; - filter = fz_dict_gets(dict, "Filter"); - if (!strcmp(fz_to_name(filter), "JPXDecode")) + filter = fz_dict_gets(ctx, dict, "Filter"); + if (!strcmp(fz_to_name(ctx, filter), "JPXDecode")) return 1; - for (i = 0; i < fz_array_len(filter); i++) - if (!strcmp(fz_to_name(fz_array_get(filter, i)), "JPXDecode")) + n = fz_array_len(ctx, filter); + for (i = 0; i < n; i++) + if (!strcmp(fz_to_name(ctx, fz_array_get(ctx, filter, i)), "JPXDecode")) return 1; return 0; } @@ -290,6 +292,7 @@ pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict) fz_colorspace *colorspace; fz_pixmap *img; fz_obj *obj; + fz_context *ctx = xref->ctx; colorspace = NULL; @@ -297,7 +300,7 @@ pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict) if (error) return fz_error_note(error, "cannot load jpx image data"); - obj = fz_dict_gets(dict, "ColorSpace"); + obj = fz_dict_gets(ctx, dict, "ColorSpace"); if (obj) { error = pdf_load_colorspace(&colorspace, xref, obj); @@ -305,26 +308,26 @@ pdf_load_jpx_image(fz_pixmap **imgp, pdf_xref *xref, fz_obj *dict) fz_error_handle(error, "cannot load image colorspace"); } - error = fz_load_jpx_image(&img, buf->data, buf->len, colorspace); + error = fz_load_jpx_image(ctx, &img, buf->data, buf->len, colorspace); if (error) { if (colorspace) - fz_drop_colorspace(colorspace); - fz_drop_buffer(buf); + fz_drop_colorspace(ctx, colorspace); + fz_drop_buffer(ctx, buf); return fz_error_note(error, "cannot load jpx image"); } if (colorspace) - fz_drop_colorspace(colorspace); - fz_drop_buffer(buf); + fz_drop_colorspace(ctx, colorspace); + fz_drop_buffer(ctx, buf); - obj = fz_dict_getsa(dict, "SMask", "Mask"); - if (fz_is_dict(obj)) + obj = fz_dict_getsa(ctx, dict, "SMask", "Mask"); + if (fz_is_dict(ctx, obj)) { error = pdf_load_image_imp(&img->mask, xref, NULL, obj, NULL, 1); if (error) { - fz_drop_pixmap(img); + fz_drop_pixmap(ctx, img); return fz_error_note(error, "cannot load image mask/softmask"); } } @@ -337,8 +340,9 @@ fz_error pdf_load_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *dict) { fz_error error; + fz_context *ctx = xref->ctx; - if ((*pixp = pdf_find_item(xref->store, fz_drop_pixmap, dict))) + if ((*pixp = pdf_find_item(ctx, xref->store, (pdf_store_drop_fn *)fz_drop_pixmap, dict))) { fz_keep_pixmap(*pixp); return fz_okay; @@ -348,7 +352,7 @@ pdf_load_image(fz_pixmap **pixp, pdf_xref *xref, fz_obj *dict) if (error) return fz_error_note(error, "cannot load image (%d 0 R)", fz_to_num(dict)); - pdf_store_item(xref->store, fz_keep_pixmap, fz_drop_pixmap, dict, *pixp); + pdf_store_item(ctx, xref->store, (pdf_store_keep_fn *)fz_keep_pixmap, (pdf_store_drop_fn *)fz_drop_pixmap, dict, *pixp); return fz_okay; } |