Commit cfaeeadb authored by Adrian Johnson's avatar Adrian Johnson
Browse files

pdfimages: support 16bpc png and tiff images

bug 99988
parent 1b0653ce
......@@ -117,6 +117,10 @@ bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
bit_depth = 8;
color_type = PNG_COLOR_TYPE_RGB;
break;
case RGB48:
bit_depth = 16;
color_type = PNG_COLOR_TYPE_RGB;
break;
case RGBA:
bit_depth = 8;
color_type = PNG_COLOR_TYPE_RGB_ALPHA;
......
......@@ -32,8 +32,9 @@ public:
* RGBA - 4 bytes/pixel
* GRAY - 1 byte/pixel
* MONOCHROME - 8 pixels/byte
* RGB48 - 6 bytes/pixel
*/
enum Format { RGB, RGBA, GRAY, MONOCHROME };
enum Format { RGB, RGBA, GRAY, MONOCHROME, RGB48 };
PNGWriter(Format format = RGB);
~PNGWriter();
......
......@@ -147,6 +147,12 @@ bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDP
samplesperpixel = 4;
photometric = PHOTOMETRIC_SEPARATED;
break;
case RGB48:
samplesperpixel = 3;
bitspersample = 16;
photometric = PHOTOMETRIC_RGB;
break;
}
// Open the file
......
......@@ -31,8 +31,9 @@ public:
* GRAY - 1 byte/pixel
* MONOCHROME - 8 pixels/byte
* CMYK - 4 bytes/pixel
* RGB48 - 6 bytes/pixel
*/
enum Format { RGB, RGBA_PREMULTIPLIED, GRAY, MONOCHROME, CMYK };
enum Format { RGB, RGBA_PREMULTIPLIED, GRAY, MONOCHROME, CMYK, RGB48 };
TiffWriter(Format format = RGB);
~TiffWriter();
......
......@@ -132,6 +132,10 @@ static inline Guchar colToByte(GfxColorComp x) {
return (Guchar)(((x << 8) - x + 0x8000) >> 16);
}
static inline Gushort colToShort(GfxColorComp x) {
return (Gushort)(x);
}
//------------------------------------------------------------------------
// GfxColor
//------------------------------------------------------------------------
......
......@@ -349,7 +349,11 @@ void ImageOutputDev::writeImageFile(ImgWriter *writer, ImageFormat format, const
str->reset();
}
row = (unsigned char *) gmallocn(width, sizeof(unsigned int));
int pixelSize = sizeof(unsigned int);
if (format == imgRGB48)
pixelSize = 2*sizeof(unsigned int);
row = (unsigned char *) gmallocn(width, pixelSize);
// PDF masks use 0 = draw current color, 1 = leave unchanged.
// We invert this to provide the standard interpretation of alpha
......@@ -384,6 +388,26 @@ void ImageOutputDev::writeImageFile(ImgWriter *writer, ImageFormat format, const
writer->writeRow(&row);
break;
case imgRGB48: {
p = imgStr->getLine();
Gushort *rowp16 = (Gushort*)row;
for (int x = 0; x < width; ++x) {
if (p) {
colorMap->getRGB(p, &rgb);
*rowp16++ = colToShort(rgb.r);
*rowp16++ = colToShort(rgb.g);
*rowp16++ = colToShort(rgb.b);
p += colorMap->getNumPixelComps();
} else {
*rowp16++ = 0;
*rowp16++ = 0;
*rowp16++ = 0;
}
}
writer->writeRow(&row);
break;
}
case imgCMYK:
p = imgStr->getLine();
rowp = row;
......@@ -532,6 +556,12 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str,
colorMap->getColorSpace()->getMode() == csCalGray) {
writer = new PNGWriter(PNGWriter::GRAY);
format = imgGray;
} else if ((colorMap->getColorSpace()->getMode() == csDeviceRGB ||
colorMap->getColorSpace()->getMode() == csCalRGB ||
(colorMap->getColorSpace()->getMode() == csICCBased && colorMap->getNumPixelComps() == 3)) &&
colorMap->getBits() > 8) {
writer = new PNGWriter(PNGWriter::RGB48);
format = imgRGB48;
} else {
writer = new PNGWriter(PNGWriter::RGB);
format = imgRGB;
......@@ -557,6 +587,12 @@ void ImageOutputDev::writeImage(GfxState *state, Object *ref, Stream *str,
(colorMap->getColorSpace()->getMode() == csICCBased && colorMap->getNumPixelComps() == 4)) {
writer = new TiffWriter(TiffWriter::CMYK);
format = imgCMYK;
} else if ((colorMap->getColorSpace()->getMode() == csDeviceRGB ||
colorMap->getColorSpace()->getMode() == csCalRGB ||
(colorMap->getColorSpace()->getMode() == csICCBased && colorMap->getNumPixelComps() == 3)) &&
colorMap->getBits() > 8) {
writer = new TiffWriter(TiffWriter::RGB48);
format = imgRGB48;
} else {
writer = new TiffWriter(TiffWriter::RGB);
format = imgRGB;
......
......@@ -55,6 +55,7 @@ public:
};
enum ImageFormat {
imgRGB,
imgRGB48,
imgGray,
imgMonochrome,
imgCMYK
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment