summaryrefslogtreecommitdiff
path: root/pdf/pdf_image.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-09-14 17:36:57 +0100
committerRobin Watts <Robin.Watts@artifex.com>2011-09-15 14:50:17 +0100
commitb51ef0eea028c73b6379e832eaa34fff3fbbb927 (patch)
tree1ab685ccd356e7fdc832b2e3322c0486b2670cfb /pdf/pdf_image.c
parent89ae81f651bfa112b8e07317eb6983beaf7cb212 (diff)
downloadmupdf-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.c98
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;
}