summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-07-12 13:07:19 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-07-12 14:45:46 +0200
commit111dee34f42181678cb26835205cda2cdf1fa6d0 (patch)
tree2711861bac5801ce5c5cbc557651c1f0891e4925 /source/pdf
parent5d70d34fb639e8f46bb9246d84020f9e3b307b6a (diff)
downloadmupdf-111dee34f42181678cb26835205cda2cdf1fa6d0.tar.xz
Fix bugs in pdf_add_image.
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/pdf-device.c4
-rw-r--r--source/pdf/pdf-image.c21
2 files changed, 17 insertions, 8 deletions
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 4af09b0e..3b974efe 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -857,6 +857,10 @@ pdf_dev_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const
fz_pre_translate(&local_ctm, 0, -1);
pdf_dev_ctm(ctx, pdev, &local_ctm);
fz_buffer_printf(ctx, gs->buf, "/Img%d Do Q\n", pdf_to_num(ctx, im_res));
+
+ /* Possibly add to page resources */
+ pdf_dev_add_image_res(ctx, dev, im_res);
+ pdf_drop_obj(ctx, im_res);
}
static void
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index 50d29e93..0b8bd6b1 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -329,12 +329,12 @@ pdf_add_image(fz_context *ctx, pdf_document *doc, fz_image *image, int mask)
pixmap = fz_get_pixmap_from_image(ctx, image, NULL, NULL, NULL, NULL);
colorspace = pixmap->colorspace; /* May be different to image->colorspace! */
n = (pixmap->n == 1 ? 1 : pixmap->n - pixmap->alpha);
- d = buffer->data;
s = pixmap->samples;
h = image->h;
size = image->w * n;
- buffer = fz_new_buffer(ctx, size);
- buffer->len = size;
+ buffer = fz_new_buffer(ctx, size * h);
+ buffer->len = size * h;
+ d = buffer->data;
if (pixmap->alpha == 0 || n == 1)
{
while (h--)
@@ -347,18 +347,20 @@ pdf_add_image(fz_context *ctx, pdf_document *doc, fz_image *image, int mask)
else
{
/* Need to remove the alpha plane */
- int mod = n;
- int stride = pixmap->stride - pixmap->w * pixmap->n;
+ /* TODO: extract alpha plane to a soft mask */
+ int pad = pixmap->stride - pixmap->w * pixmap->n;
while (h--)
{
- while (size--)
+ unsigned int size2 = size;
+ int mod = n;
+ while (size2--)
{
*d++ = *s++;
mod--;
if (mod == 0)
s++, mod = n;
}
- s += stride;
+ s += pad;
}
}
}
@@ -447,7 +449,10 @@ pdf_add_image(fz_context *ctx, pdf_document *doc, fz_image *image, int mask)
pdf_dict_put_drop(ctx, imobj, PDF_NAME_ImageMask, pdf_new_bool(ctx, doc, 1));
}
if (image->mask)
- pdf_add_image(ctx, doc, image->mask, 0);
+ {
+ pdf_dict_put_drop(ctx, imobj, PDF_NAME_SMask, pdf_add_image(ctx, doc, image->mask, 0));
+ }
+
imref = pdf_add_object(ctx, doc, imobj);
pdf_update_stream(ctx, doc, imref, buffer, 1);