summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2017-08-13 00:59:29 +0800
committerSebastian Rasmussen <sebras@gmail.com>2017-08-16 21:09:58 +0800
commite349ba5984fe837d3eec9649d718efe16169ca44 (patch)
tree9faa8dd8799f2870aeb0b4acf0771e5e7338972b
parent2e9891c20d83d7a5fa09140ce8046a82dd758433 (diff)
downloadmupdf-e349ba5984fe837d3eec9649d718efe16169ca44.tar.xz
Bug 698168: Add support for writing indexed images to pdfs.
-rw-r--r--source/pdf/pdf-image.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index 45273cfb..183f602a 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -447,10 +447,43 @@ raw_or_unknown_compression:
}
else
{
+ fz_colorspace *cs;
+
pdf_dict_put_drop(ctx, imobj, PDF_NAME_BitsPerComponent, pdf_new_int(ctx, doc, image->bpc));
- n = fz_colorspace_n(ctx, pixmap ? pixmap->colorspace : image->colorspace);
- if (n <= 1)
+ cs = pixmap ? pixmap->colorspace : image->colorspace;
+ n = fz_colorspace_n(ctx, cs);
+
+ if (fz_colorspace_is_indexed(ctx, cs))
+ {
+ fz_colorspace *basecs;
+ unsigned char *lookup = NULL;
+ int high = 0;
+ int basen;
+ pdf_obj *arr;
+
+ lookup = fz_indexed_colorspace_palette(ctx, cs, &high);
+ basecs = fz_colorspace_base(ctx, cs);
+ basen = fz_colorspace_n(ctx, basecs);
+
+ pdf_dict_put_drop(ctx, imobj, PDF_NAME_ColorSpace, arr = pdf_new_array(ctx, doc, 4));
+
+ pdf_array_put_drop(ctx, arr, 0, PDF_NAME_Indexed);
+ if (basen <= 1)
+ pdf_array_put_drop(ctx, arr, 1, PDF_NAME_DeviceGray);
+ else if (basen == 3)
+ // TODO: Lab colorspace?
+ pdf_array_put_drop(ctx, arr, 1, PDF_NAME_DeviceRGB);
+ else if (basen == 4)
+ pdf_array_put_drop(ctx, arr, 1, PDF_NAME_DeviceCMYK);
+ else
+ // TODO: convert to RGB!
+ fz_throw(ctx, FZ_ERROR_GENERIC, "only indexed Gray, RGB, and CMYK colorspaces supported");
+
+ pdf_array_put_drop(ctx, arr, 2, pdf_new_int(ctx, doc, high));
+ pdf_array_put_drop(ctx, arr, 3, pdf_new_string(ctx, doc, (char *) lookup, basen * (high + 1)));
+ }
+ else if (n <= 1)
pdf_dict_put_drop(ctx, imobj, PDF_NAME_ColorSpace, PDF_NAME_DeviceGray);
else if (n == 3)
// TODO: Lab colorspace?