X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=coders%2Ftiff.c;h=5bf4489fb96a9cf71c7056ea3f6a8b1505593105;hb=8418c7e51974060a1c724e25d700d72fb437174b;hp=63bdb43a84d223c504a759bb14bf45973c8b2892;hpb=64bcc415f271884183f91410ed25ba85c86f1fe8;p=imagemagick diff --git a/coders/tiff.c b/coders/tiff.c index 63bdb43a8..5bf4489fb 100644 --- a/coders/tiff.c +++ b/coders/tiff.c @@ -1844,6 +1844,74 @@ RestoreMSCWarning static TIFFExtendProc tag_extender = (TIFFExtendProc) NULL; +static void TIFFIgnoreTags(TIFF *tiff) +{ + char + *q; + + const char + *p, + *tags; + + Image + *image; + + register ssize_t + i; + + size_t + count; + + TIFFFieldInfo + *ignore; + + if (TIFFGetReadProc(tiff) != TIFFReadBlob) + return; + image=(Image *)TIFFClientdata(tiff); + tags=GetImageArtifact(image,"tiff:ignore-tags"); + if (tags == (const char *) NULL) + return; + count=0; + p=tags; + while (*p != '\0') + { + while ((isspace((int) ((unsigned char) *p)) != 0)) + p++; + + (void) strtol(p,&q,10); + if (p == q) + return; + + p=q; + count++; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + } + if (count == 0) + return; + i=0; + p=tags; + ignore=(TIFFFieldInfo *) AcquireQuantumMemory(count,sizeof(*ignore)); + // This also sets field_bit to 0 (FIELD_IGNORE) + ResetMagickMemory(ignore,0,count*sizeof(*ignore)); + while (*p != '\0') + { + while ((isspace((int) ((unsigned char) *p)) != 0)) + p++; + + ignore[i].field_tag=(ttag_t) strtol(p,&q,10); + + p=q; + i++; + + while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == ',')) + p++; + } + (void) TIFFMergeFieldInfo(tiff,ignore,(uint32) count); + ignore=(TIFFFieldInfo *) RelinquishMagickMemory(ignore); +} + static void TIFFTagExtender(TIFF *tiff) { static const TIFFFieldInfo @@ -1859,6 +1927,7 @@ static void TIFFTagExtender(TIFF *tiff) sizeof(*TIFFExtensions)); if (tag_extender != (TIFFExtendProc) NULL) (*tag_extender)(tiff); + TIFFIgnoreTags(tiff); } #endif @@ -2795,6 +2864,8 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, (image_info->type != OptimizeType)) (void) SetImageType(image,image_info->type,exception); compression=UndefinedCompression; + if (image->compression != JPEGCompression) + compression=image->compression; if (image_info->compression != UndefinedCompression) compression=image_info->compression; switch (compression) @@ -3001,8 +3072,6 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, } } } - if (photometric == PHOTOMETRIC_RGB) - (void) TransformImageColorspace(image,sRGBColorspace,exception); switch (image->endian) { case LSBEndian: @@ -3210,7 +3279,7 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, if (rows_per_strip < 1) rows_per_strip=1; if ((image->rows/rows_per_strip) >= (1UL << 15)) - rows_per_strip=(image->rows >> 15); + rows_per_strip=(uint32) (image->rows >> 15); (void) TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rows_per_strip); if ((image->resolution.x != 0.0) && (image->resolution.y != 0.0)) {