diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2017-08-13 00:59:29 +0800 |
---|---|---|
committer | Sebastian Rasmussen <sebras@gmail.com> | 2017-08-16 21:09:58 +0800 |
commit | e349ba5984fe837d3eec9649d718efe16169ca44 (patch) | |
tree | 9faa8dd8799f2870aeb0b4acf0771e5e7338972b | |
parent | 2e9891c20d83d7a5fa09140ce8046a82dd758433 (diff) | |
download | mupdf-e349ba5984fe837d3eec9649d718efe16169ca44.tar.xz |
Bug 698168: Add support for writing indexed images to pdfs.
-rw-r--r-- | source/pdf/pdf-image.c | 37 |
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? |