diff options
-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? |