From: cristy Date: Thu, 16 Sep 2010 19:48:33 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~8900 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79e5dad0b7c52b29263c5b40e93df7fa66d6016e;p=imagemagick --- diff --git a/ChangeLog b/ChangeLog index 417cbed59..2aefa8d45 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2010-09-16 6.6.4-2 Cristy * IPTC profile not always wrapped properly inside an 8BIM profile. + * TIFF tile geometry must be divisible by 16. 2010-09-15 6.6.4-2 Anthony Thyssen * Rename of SincPolynomial to SincFast for easier user understanding diff --git a/coders/tiff.c b/coders/tiff.c index 3297841e1..926f59b55 100644 --- a/coders/tiff.c +++ b/coders/tiff.c @@ -904,6 +904,11 @@ static Image *ReadTIFFImage(const ImageInfo *image_info, (void) SetImageProperty(image,"tiff:photometric","separated"); break; } + case PHOTOMETRIC_YCBCR: + { + (void) SetImageProperty(image,"tiff:photometric","YCBCR"); + break; + } default: { (void) SetImageProperty(image,"tiff:photometric","unknown"); @@ -2109,6 +2114,10 @@ static MagickBooleanType GetTIFFInfo(const ImageInfo *image_info,TIFF *tiff, MagickStatusType flags; + uint32 + tile_columns, + tile_rows; + assert(tiff_info != (TIFFInfo *) NULL); (void) ResetMagickMemory(tiff_info,0,sizeof(*tiff_info)); option=GetImageOption(image_info,"tiff:tile-geometry"); @@ -2117,15 +2126,17 @@ static MagickBooleanType GetTIFFInfo(const ImageInfo *image_info,TIFF *tiff, flags=ParseAbsoluteGeometry(option,&tiff_info->tile_geometry); if ((flags & HeightValue) == 0) tiff_info->tile_geometry.height=tiff_info->tile_geometry.width; - (void) TIFFSetField(tiff,TIFFTAG_TILEWIDTH,(uint32) - tiff_info->tile_geometry.width); - (void) TIFFSetField(tiff,TIFFTAG_TILELENGTH,(uint32) - tiff_info->tile_geometry.height); + tile_columns=tiff_info->tile_geometry.width; + tile_rows=tiff_info->tile_geometry.height; + TIFFDefaultTileSize(tiff,&tile_columns,&tile_rows); + (void) TIFFSetField(tiff,TIFFTAG_TILEWIDTH,tile_columns); + (void) TIFFSetField(tiff,TIFFTAG_TILELENGTH,tile_rows); + tiff_info->tile_geometry.width=tile_columns; + tiff_info->tile_geometry.height=tile_rows; tiff_info->scanlines=(unsigned char *) AcquireQuantumMemory((size_t) - tiff_info->tile_geometry.height*TIFFScanlineSize(tiff), - sizeof(*tiff_info->scanlines)); + tile_rows*TIFFScanlineSize(tiff),sizeof(*tiff_info->scanlines)); tiff_info->pixels=(unsigned char *) AcquireQuantumMemory((size_t) - TIFFTileSize(tiff),sizeof(*tiff_info->scanlines)); + tile_rows*TIFFTileSize(tiff),sizeof(*tiff_info->scanlines)); if ((tiff_info->scanlines == (unsigned char *) NULL) || (tiff_info->pixels == (unsigned char *) NULL)) { @@ -2634,6 +2645,7 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, { photometric=PHOTOMETRIC_YCBCR; (void) TIFFSetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,1,1); + (void) SetImageStorageClass(image,DirectClass); (void) SetImageDepth(image,8); } else @@ -2832,8 +2844,9 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, flags=ParseGeometry(sampling_factor,&geometry_info); if ((flags & SigmaValue) == 0) geometry_info.sigma=geometry_info.rho; - (void) TIFFSetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,(uint16) - geometry_info.rho,(uint16) geometry_info.sigma); + if (image->colorspace == YCbCrColorspace) + (void) TIFFSetField(tiff,TIFFTAG_YCBCRSUBSAMPLING,(uint16) + geometry_info.rho,(uint16) geometry_info.sigma); } } if (bits_per_sample == 12) @@ -2882,7 +2895,9 @@ static MagickBooleanType WriteTIFFImage(const ImageInfo *image_info, default: break; } - (void) TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rows_per_strip); + option=GetImageOption(image_info,"tiff:tile-geometry"); + if (option == (const char *) NULL) + (void) TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,rows_per_strip); if ((image->x_resolution != 0.0) && (image->y_resolution != 0.0)) { unsigned short diff --git a/magick/blob.c b/magick/blob.c index 692d6eefd..ef1442fb2 100644 --- a/magick/blob.c +++ b/magick/blob.c @@ -3676,6 +3676,61 @@ MagickExport MagickBooleanType SetBlobExtent(Image *image, % % % % % % ++ S k i p B l o b B y t e s % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SkipBlobBytes() skips over bytes in a blob. +% +% The format of the SkipBlobBytes method is: +% +% MagickBooleanType SkipBlobBytes(Image *image,const size_t length) +% +% A description of each parameter follows. +% +% o image: the image. +% +% o length: the number of bytes to skip. +% +*/ +MagickExport MagickBooleanType SkipBlobBytes(Image *image,const size_t length) +{ + register ssize_t + i; + + size_t + quantum; + + ssize_t + count; + + unsigned char + buffer[8192]; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + count=0; + for (i=0; i < (ssize_t) length; i+=count) + { + quantum=MagickMin(length-i,sizeof(buffer)); + (void) ReadBlobStream(image,quantum,buffer,&count); + if (count <= 0) + { + count=0; + if (errno != EINTR) + break; + } + } + return(i < (ssize_t) length ? MagickFalse : MagickTrue); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % + S y n c B l o b % % % % % diff --git a/magick/blob.h b/magick/blob.h index 16dd23c2b..eb4d71e1f 100644 --- a/magick/blob.h +++ b/magick/blob.h @@ -50,7 +50,8 @@ extern MagickExport MagickBooleanType ExceptionInfo *), IsBlobExempt(const Image *), IsBlobSeekable(const Image *), - IsBlobTemporary(const Image *); + IsBlobTemporary(const Image *), + SkipBlobBytes(Image *,const size_t); extern MagickExport MagickSizeType GetBlobSize(const Image *);