summaryrefslogtreecommitdiff
path: root/source/pdf
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf')
-rw-r--r--source/pdf/pdf-image.c43
-rw-r--r--source/pdf/pdf-resources.c10
2 files changed, 37 insertions, 16 deletions
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index 51bb4583..3bba27ad 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -40,12 +40,13 @@ pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *di
fz_pixmap_image *cimg = (fz_pixmap_image *)image;
fz_pixmap *mask_pixmap;
fz_pixmap *tile = fz_pixmap_image_tile(ctx, cimg);
- if (image->n != 2)
+ if (tile->n != 1)
{
fz_pixmap *gray;
fz_irect bbox;
- fz_warn(ctx, "soft mask should be grayscale");
- gray = fz_new_pixmap_with_bbox(ctx, fz_device_gray(ctx), fz_pixmap_bbox(ctx, tile, &bbox));
+ if (tile->n != 2)
+ fz_warn(ctx, "soft mask should be grayscale");
+ gray = fz_new_pixmap_with_bbox(ctx, fz_device_gray(ctx), fz_pixmap_bbox(ctx, tile, &bbox), 0);
fz_convert_pixmap(ctx, gray, tile);
fz_drop_pixmap(ctx, tile);
tile = gray;
@@ -323,32 +324,44 @@ pdf_add_image(fz_context *ctx, pdf_document *doc, fz_image *image, int mask)
else
{
unsigned int size;
- int n;
+ int n, h;
+ unsigned char *d, *s;
/* Currently, set to maintain resolution; should we consider
* subsampling here according to desired output res? */
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 - 1);
- size = image->w * image->h * n;
+ 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;
- if (pixmap->n == 1)
+ if (pixmap->alpha == 0 || n == 1)
{
- memcpy(buffer->data, pixmap->samples, size);
+ while (h--)
+ {
+ memcpy(d, s, size);
+ d += size;
+ s += pixmap->stride;
+ }
}
else
{
/* Need to remove the alpha plane */
- unsigned char *d = buffer->data;
- unsigned char *s = pixmap->samples;
int mod = n;
- while (size--)
+ int stride = pixmap->stride - pixmap->w * pixmap->n;
+ while (h--)
{
- *d++ = *s++;
- mod--;
- if (mod == 0)
- s++, mod = n;
+ while (size--)
+ {
+ *d++ = *s++;
+ mod--;
+ if (mod == 0)
+ s++, mod = n;
+ }
+ s += stride;
}
}
}
diff --git a/source/pdf/pdf-resources.c b/source/pdf/pdf-resources.c
index 212c57df..b66c0a23 100644
--- a/source/pdf/pdf-resources.c
+++ b/source/pdf/pdf-resources.c
@@ -27,10 +27,18 @@ res_image_get_md5(fz_context *ctx, fz_image *image, unsigned char *digest)
{
fz_pixmap *pixmap;
fz_md5 state;
+ int h;
+ unsigned char *d;
pixmap = fz_get_pixmap_from_image(ctx, image, NULL, NULL, 0, 0);
fz_md5_init(&state);
- fz_md5_update(&state, pixmap->samples, pixmap->w * pixmap->h * pixmap->n);
+ d = pixmap->samples;
+ h = pixmap->h;
+ while (h--)
+ {
+ fz_md5_update(&state, d, pixmap->w * pixmap->n);
+ d += pixmap->stride;
+ }
fz_md5_final(&state, digest);
fz_drop_pixmap(ctx, pixmap);
}