summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-image.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-01-21 16:42:45 +0100
committerTor Andersson <tor.andersson@artifex.com>2015-02-17 18:05:39 +0100
commitf84a189d5f94250e46d2cbd1a75aba00130e2dd6 (patch)
tree8ee614ab90de1baa8941f91ae4946ed5c2e70721 /source/pdf/pdf-image.c
parent681039767f2ccc72e236246178893eb0989169c9 (diff)
downloadmupdf-f84a189d5f94250e46d2cbd1a75aba00130e2dd6.tar.xz
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.
Diffstat (limited to 'source/pdf/pdf-image.c')
-rw-r--r--source/pdf/pdf-image.c112
1 files changed, 56 insertions, 56 deletions
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));