From f84a189d5f94250e46d2cbd1a75aba00130e2dd6 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 21 Jan 2015 16:42:45 +0100 Subject: Add ctx parameter and remove embedded contexts for API regularity. Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap. --- source/pdf/pdf-image.c | 112 ++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 56 deletions(-) (limited to 'source/pdf/pdf-image.c') diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c index dd96f4fb..30f96dc8 100644 --- a/source/pdf/pdf-image.c +++ b/source/pdf/pdf-image.c @@ -1,9 +1,9 @@ #include "mupdf/pdf.h" -static fz_image *pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask); +static fz_image *pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask); static fz_image * -pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask) +pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask) { fz_stream *stm = NULL; fz_image *image = NULL; @@ -21,7 +21,6 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs int stride; int i; - fz_context *ctx = doc->ctx; fz_compressed_buffer *buffer; fz_var(stm); @@ -34,7 +33,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs /* special case for JPEG2000 images */ if (pdf_is_jpx_image(ctx, dict)) { - image = pdf_load_jpx(doc, dict, forcemask); + image = pdf_load_jpx(ctx, doc, dict, forcemask); if (forcemask) { @@ -56,13 +55,13 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs break; /* Out of fz_try */ } - w = pdf_to_int(pdf_dict_getsa(dict, "Width", "W")); - h = pdf_to_int(pdf_dict_getsa(dict, "Height", "H")); - bpc = pdf_to_int(pdf_dict_getsa(dict, "BitsPerComponent", "BPC")); + w = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Width", "W")); + h = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Height", "H")); + bpc = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "BitsPerComponent", "BPC")); if (bpc == 0) bpc = 8; - imagemask = pdf_to_bool(pdf_dict_getsa(dict, "ImageMask", "IM")); - interpolate = pdf_to_bool(pdf_dict_getsa(dict, "Interpolate", "I")); + imagemask = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "ImageMask", "IM")); + interpolate = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "Interpolate", "I")); indexed = 0; usecolorkey = 0; @@ -83,19 +82,19 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs if (h > (1 << 16)) fz_throw(ctx, FZ_ERROR_GENERIC, "image is too high"); - obj = pdf_dict_getsa(dict, "ColorSpace", "CS"); + obj = pdf_dict_getsa(ctx, dict, "ColorSpace", "CS"); if (obj && !imagemask && !forcemask) { /* colorspace resource lookup is only done for inline images */ - if (pdf_is_name(obj)) + if (pdf_is_name(ctx, obj)) { - res = pdf_dict_get(pdf_dict_gets(rdb, "ColorSpace"), obj); + res = pdf_dict_get(ctx, pdf_dict_gets(ctx, rdb, "ColorSpace"), obj); if (res) obj = res; } - colorspace = pdf_load_colorspace(doc, obj); - indexed = fz_colorspace_is_indexed(colorspace); + colorspace = pdf_load_colorspace(ctx, doc, obj); + indexed = fz_colorspace_is_indexed(ctx, colorspace); n = colorspace->n; } @@ -104,11 +103,11 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs n = 1; } - obj = pdf_dict_getsa(dict, "Decode", "D"); + obj = pdf_dict_getsa(ctx, dict, "Decode", "D"); if (obj) { for (i = 0; i < n * 2; i++) - decode[i] = pdf_to_real(pdf_array_get(obj, i)); + decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } else { @@ -117,8 +116,8 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs decode[i] = i & 1 ? maxval : 0; } - obj = pdf_dict_getsa(dict, "SMask", "Mask"); - if (pdf_is_dict(obj)) + obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask"); + if (pdf_is_dict(ctx, obj)) { /* Not allowed for inline images or soft masks */ if (cstm) @@ -127,27 +126,27 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs fz_warn(ctx, "Ignoring recursive image soft mask"); else { - mask = pdf_load_image_imp(doc, rdb, obj, NULL, 1); - obj = pdf_dict_gets(obj, "Matte"); - if (pdf_is_array(obj)) + mask = pdf_load_image_imp(ctx, doc, rdb, obj, NULL, 1); + obj = pdf_dict_gets(ctx, obj, "Matte"); + if (pdf_is_array(ctx, obj)) { usecolorkey = 1; for (i = 0; i < n; i++) - colorkey[i] = pdf_to_real(pdf_array_get(obj, i)) * 255; + colorkey[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)) * 255; } } } - else if (pdf_is_array(obj)) + else if (pdf_is_array(ctx, obj)) { usecolorkey = 1; for (i = 0; i < n * 2; i++) { - if (!pdf_is_int(pdf_array_get(obj, i))) + if (!pdf_is_int(ctx, pdf_array_get(ctx, obj, i))) { fz_warn(ctx, "invalid value in color key mask"); usecolorkey = 0; } - colorkey[i] = pdf_to_int(pdf_array_get(obj, i)); + colorkey[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i)); } } @@ -156,9 +155,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs { /* Just load the compressed image data now and we can * decode it on demand. */ - int num = pdf_to_num(dict); - int gen = pdf_to_gen(dict); - buffer = pdf_load_compressed_stream(doc, num, gen); + int num = pdf_to_num(ctx, dict); + int gen = pdf_to_gen(ctx, dict); + buffer = pdf_load_compressed_stream(ctx, doc, num, gen); image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, buffer, mask); } else @@ -166,7 +165,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs /* Inline stream */ stride = (w * n * bpc + 7) / 8; image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, NULL, mask); - pdf_load_compressed_inline_image(doc, dict, stride * h, cstm, indexed, image); + pdf_load_compressed_inline_image(ctx, doc, dict, stride * h, cstm, indexed, image); } } @@ -181,9 +180,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs } fz_image * -pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file) +pdf_load_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file) { - return pdf_load_image_imp(doc, rdb, dict, file, 0); + return pdf_load_image_imp(ctx, doc, rdb, dict, file, 0); } int @@ -192,79 +191,81 @@ pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict) pdf_obj *filter; int i, n; - filter = pdf_dict_gets(dict, "Filter"); - if (!strcmp(pdf_to_name(filter), "JPXDecode")) + filter = pdf_dict_gets(ctx, dict, "Filter"); + if (!strcmp(pdf_to_name(ctx, filter), "JPXDecode")) return 1; - n = pdf_array_len(filter); + n = pdf_array_len(ctx, filter); for (i = 0; i < n; i++) - if (!strcmp(pdf_to_name(pdf_array_get(filter, i)), "JPXDecode")) + if (!strcmp(pdf_to_name(ctx, pdf_array_get(ctx, filter, i)), "JPXDecode")) return 1; return 0; } static fz_image * -pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask) +pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask) { fz_buffer *buf = NULL; fz_colorspace *colorspace = NULL; - fz_pixmap *img = NULL; + fz_pixmap *pix = NULL; pdf_obj *obj; - fz_context *ctx = doc->ctx; int indexed = 0; fz_image *mask = NULL; + fz_image *img = NULL; - fz_var(img); + fz_var(pix); fz_var(buf); fz_var(colorspace); fz_var(mask); - buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict)); + buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict)); /* FIXME: We can't handle decode arrays for indexed images currently */ fz_try(ctx) { - obj = pdf_dict_gets(dict, "ColorSpace"); + obj = pdf_dict_gets(ctx, dict, "ColorSpace"); if (obj) { - colorspace = pdf_load_colorspace(doc, obj); - indexed = fz_colorspace_is_indexed(colorspace); + colorspace = pdf_load_colorspace(ctx, doc, obj); + indexed = fz_colorspace_is_indexed(ctx, colorspace); } - img = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed); + pix = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed); - obj = pdf_dict_getsa(dict, "SMask", "Mask"); - if (pdf_is_dict(obj)) + obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask"); + if (pdf_is_dict(ctx, obj)) { if (forcemask) fz_warn(ctx, "Ignoring recursive JPX soft mask"); else - mask = pdf_load_image_imp(doc, NULL, obj, NULL, 1); + mask = pdf_load_image_imp(ctx, doc, NULL, obj, NULL, 1); } - obj = pdf_dict_getsa(dict, "Decode", "D"); + obj = pdf_dict_getsa(ctx, dict, "Decode", "D"); if (obj && !indexed) { float decode[FZ_MAX_COLORS * 2]; int i; - for (i = 0; i < img->n * 2; i++) - decode[i] = pdf_to_real(pdf_array_get(obj, i)); + for (i = 0; i < pix->n * 2; i++) + decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); - fz_decode_tile(img, decode); + fz_decode_tile(ctx, pix, decode); } + + img = fz_new_image_from_pixmap(ctx, pix, mask); } fz_always(ctx) { fz_drop_colorspace(ctx, colorspace); fz_drop_buffer(ctx, buf); + fz_drop_pixmap(ctx, pix); } fz_catch(ctx) { - fz_drop_pixmap(ctx, img); fz_rethrow(ctx); } - return fz_new_image_from_pixmap(ctx, img, mask); + return img; } static int @@ -276,9 +277,8 @@ fz_image_size(fz_context *ctx, fz_image *im) } fz_image * -pdf_load_image(pdf_document *doc, pdf_obj *dict) +pdf_load_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { - fz_context *ctx = doc->ctx; fz_image *image; if ((image = pdf_find_item(ctx, fz_drop_image_imp, dict)) != NULL) @@ -286,7 +286,7 @@ pdf_load_image(pdf_document *doc, pdf_obj *dict) return (fz_image *)image; } - image = pdf_load_image_imp(doc, NULL, dict, NULL, 0); + image = pdf_load_image_imp(ctx, doc, NULL, dict, NULL, 0); pdf_store_item(ctx, dict, image, fz_image_size(ctx, image)); -- cgit v1.2.3