| diff --git a/third_party/libtiff/tif_dir.c b/third_party/libtiff/tif_dir.c | |
| index 6f0b48798..028ea54a2 100644 | |
| --- a/third_party/libtiff/tif_dir.c | |
| +++ b/third_party/libtiff/tif_dir.c | |
| @@ -88,13 +88,15 @@ setDoubleArrayOneValue(double** vpp, double value, size_t nmemb) | |
| * Install extra samples information. | |
| */ | |
| static int | |
| -setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v) | |
| +setExtraSamples(TIFF* tif, va_list ap, uint32* v) | |
| { | |
| /* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */ | |
| #define EXTRASAMPLE_COREL_UNASSALPHA 999 | |
| uint16* va; | |
| uint32 i; | |
| + TIFFDirectory* td = &tif->tif_dir; | |
| + static const char module[] = "setExtraSamples"; | |
| *v = (uint16) va_arg(ap, uint16_vap); | |
| if ((uint16) *v > td->td_samplesperpixel) | |
| @@ -116,6 +118,18 @@ setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v) | |
| return 0; | |
| } | |
| } | |
| + | |
| + if ( td->td_transferfunction[0] != NULL && (td->td_samplesperpixel - *v > 1) && | |
| + !(td->td_samplesperpixel - td->td_extrasamples > 1)) | |
| + { | |
| + TIFFWarningExt(tif->tif_clientdata,module, | |
| + "ExtraSamples tag value is changing, " | |
| + "but TransferFunction was read with a different value. Cancelling it"); | |
| + TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION); | |
| + _TIFFfree(td->td_transferfunction[0]); | |
| + td->td_transferfunction[0] = NULL; | |
| + } | |
| + | |
| td->td_extrasamples = (uint16) *v; | |
| _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples); | |
| return 1; | |
| @@ -285,6 +299,18 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) | |
| _TIFFfree(td->td_smaxsamplevalue); | |
| td->td_smaxsamplevalue = NULL; | |
| } | |
| + /* Test if 3 transfer functions instead of just one are now needed | |
| + See http://bugzilla.maptools.org/show_bug.cgi?id=2820 */ | |
| + if( td->td_transferfunction[0] != NULL && (v - td->td_extrasamples > 1) && | |
| + !(td->td_samplesperpixel - td->td_extrasamples > 1)) | |
| + { | |
| + TIFFWarningExt(tif->tif_clientdata,module, | |
| + "SamplesPerPixel tag value is changing, " | |
| + "but TransferFunction was read with a different value. Cancelling it"); | |
| + TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION); | |
| + _TIFFfree(td->td_transferfunction[0]); | |
| + td->td_transferfunction[0] = NULL; | |
| + } | |
| } | |
| td->td_samplesperpixel = (uint16) v; | |
| break; | |
| @@ -361,7 +387,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) | |
| _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32); | |
| break; | |
| case TIFFTAG_EXTRASAMPLES: | |
| - if (!setExtraSamples(td, ap, &v)) | |
| + if (!setExtraSamples(tif, ap, &v)) | |
| goto badvalue; | |
| break; | |
| case TIFFTAG_MATTEING: |