Index: third_party/libtiff/tif_getimage.c |
diff --git a/third_party/libtiff/tif_getimage.c b/third_party/libtiff/tif_getimage.c |
index f49b73fd474fca270d18e20ab0b5806b0a6ebc47..85237937ec83d96552558e0e86e38331ae8be818 100644 |
--- a/third_party/libtiff/tif_getimage.c |
+++ b/third_party/libtiff/tif_getimage.c |
@@ -182,20 +182,22 @@ TIFFRGBAImageOK(TIFF* tif, char emsg[1024]) |
"Planarconfiguration", td->td_planarconfig); |
return (0); |
} |
- if( td->td_samplesperpixel != 3 ) |
+ if( td->td_samplesperpixel != 3 || colorchannels != 3 ) |
{ |
sprintf(emsg, |
- "Sorry, can not handle image with %s=%d", |
- "Samples/pixel", td->td_samplesperpixel); |
+ "Sorry, can not handle image with %s=%d, %s=%d", |
+ "Samples/pixel", td->td_samplesperpixel, |
+ "colorchannels", colorchannels); |
return 0; |
} |
break; |
case PHOTOMETRIC_CIELAB: |
- if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 ) |
+ if( td->td_samplesperpixel != 3 || colorchannels != 3 || td->td_bitspersample != 8 ) |
{ |
sprintf(emsg, |
- "Sorry, can not handle image with %s=%d and %s=%d", |
+ "Sorry, can not handle image with %s=%d, %s=%d and %s=%d", |
"Samples/pixel", td->td_samplesperpixel, |
+ "colorchannels", colorchannels, |
"Bits/sample", td->td_bitspersample); |
return 0; |
} |
@@ -255,6 +257,9 @@ TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024]) |
int colorchannels; |
uint16 *red_orig, *green_orig, *blue_orig; |
int n_color; |
+ |
+ if( !TIFFRGBAImageOK(tif, emsg) ) |
+ return 0; |
/* Initialize to normal values */ |
img->row_offset = 0; |
@@ -2508,29 +2513,33 @@ PickContigCase(TIFFRGBAImage* img) |
case PHOTOMETRIC_RGB: |
switch (img->bitspersample) { |
case 8: |
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA) |
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA && |
+ img->samplesperpixel >= 4) |
img->put.contig = putRGBAAcontig8bittile; |
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA) |
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA && |
+ img->samplesperpixel >= 4) |
{ |
if (BuildMapUaToAa(img)) |
img->put.contig = putRGBUAcontig8bittile; |
} |
- else |
+ else if( img->samplesperpixel >= 3 ) |
img->put.contig = putRGBcontig8bittile; |
break; |
case 16: |
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA) |
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA && |
+ img->samplesperpixel >=4 ) |
{ |
if (BuildMapBitdepth16To8(img)) |
img->put.contig = putRGBAAcontig16bittile; |
} |
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA) |
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA && |
+ img->samplesperpixel >=4 ) |
{ |
if (BuildMapBitdepth16To8(img) && |
BuildMapUaToAa(img)) |
img->put.contig = putRGBUAcontig16bittile; |
} |
- else |
+ else if( img->samplesperpixel >=3 ) |
{ |
if (BuildMapBitdepth16To8(img)) |
img->put.contig = putRGBcontig16bittile; |
@@ -2539,7 +2548,7 @@ PickContigCase(TIFFRGBAImage* img) |
} |
break; |
case PHOTOMETRIC_SEPARATED: |
- if (buildMap(img)) { |
+ if (img->samplesperpixel >=4 && buildMap(img)) { |
if (img->bitspersample == 8) { |
if (!img->Map) |
img->put.contig = putRGBcontig8bitCMYKtile; |
@@ -2635,7 +2644,7 @@ PickContigCase(TIFFRGBAImage* img) |
} |
break; |
case PHOTOMETRIC_CIELAB: |
- if (buildMap(img)) { |
+ if (img->samplesperpixel == 3 && buildMap(img)) { |
if (img->bitspersample == 8) |
img->put.contig = initCIELabConversion(img); |
break; |