From 271623e1de659fddd7b8c66491b0ec9ddfa22ddd Mon Sep 17 00:00:00 2001 From: Cristy Date: Wed, 7 Aug 2019 08:59:07 -0400 Subject: [PATCH] Enable reading EXR image file from stdin --- ChangeLog | 6 ++++++ coders/exr.c | 56 ++++++++++++++++++---------------------------------- 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec0f8c9c9..6d824ce56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-08-07 7.0.8-60 Cristy + * Release ImageMagick version 7.0.8-60, GIT revision 15986:c3de0e7:20190804. + +2019-08-07 7.0.8-60 Cristy + * Enable reading EXR image file from stdin. + 2019-08-04 7.0.8-59 Cristy * Release ImageMagick version 7.0.8-59, GIT revision 15986:c3de0e7:20190804. diff --git a/coders/exr.c b/coders/exr.c index 08908bf7f..ff712808c 100644 --- a/coders/exr.c +++ b/coders/exr.c @@ -65,15 +65,15 @@ /* Typedef declaractions. */ -typedef struct _ExrWindow +typedef struct _EXRWindowInfo { int max_x, max_y, min_x, min_y; -} ExrWindow; - +} EXRWindowInfo; + /* Forward declarations. */ @@ -147,16 +147,13 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) const ImfHeader *hdr_info; - ExrWindow + EXRWindowInfo data_window, display_window; Image *image; - ImageInfo - *read_info; - ImfInputFile *file; @@ -166,14 +163,13 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) MagickBooleanType status; - register ssize_t - x; - register Quantum *q; + size_t + columns; + ssize_t - columns, y; /* @@ -193,37 +189,25 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) image=DestroyImageList(image); return((Image *) NULL); } - read_info=CloneImageInfo(image_info); - if (IsPathAccessible(read_info->filename) == MagickFalse) - { - (void) AcquireUniqueFilename(read_info->filename); - (void) ImageToFile(image,read_info->filename,exception); - } - file=ImfOpenInputFile(read_info->filename); + file=ImfOpenInputFile(image->filename); if (file == (ImfInputFile *) NULL) { ThrowFileException(exception,BlobError,"UnableToOpenBlob", ImfErrorMessage()); - if (LocaleCompare(image_info->filename,read_info->filename) != 0) - (void) RelinquishUniqueFileResource(read_info->filename); - read_info=DestroyImageInfo(read_info); image=DestroyImageList(image); return((Image *) NULL); } hdr_info=ImfInputHeader(file); ImfHeaderDisplayWindow(hdr_info,&display_window.min_x,&display_window.min_y, &display_window.max_x,&display_window.max_y); - image->columns=display_window.max_x-display_window.min_x+1UL; - image->rows=display_window.max_y-display_window.min_y+1UL; + image->columns=(size_t) (display_window.max_x-display_window.min_x+1UL); + image->rows=(size_t) (display_window.max_y-display_window.min_y+1UL); image->alpha_trait=BlendPixelTrait; - SetImageColorspace(image,RGBColorspace,exception); + (void) SetImageColorspace(image,RGBColorspace,exception); image->gamma=1.0; if (image_info->ping != MagickFalse) { (void) ImfCloseInputFile(file); - if (LocaleCompare(image_info->filename,read_info->filename) != 0) - (void) RelinquishUniqueFileResource(read_info->filename); - read_info=DestroyImageInfo(read_info); (void) CloseBlob(image); return(GetFirstImageInList(image)); } @@ -232,7 +216,7 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) return(DestroyImageList(image)); ImfHeaderDataWindow(hdr_info,&data_window.min_x,&data_window.min_y, &data_window.max_x,&data_window.max_y); - columns=(ssize_t) data_window.max_x-data_window.min_x+1UL; + columns=(size_t) (data_window.max_x-data_window.min_x+1UL); if ((display_window.min_x > data_window.max_x) || (display_window.min_x+(int) image->columns <= data_window.min_x)) scanline=(ImfRgba *) NULL; @@ -242,9 +226,6 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) if (scanline == (ImfRgba *) NULL) { (void) ImfCloseInputFile(file); - if (LocaleCompare(image_info->filename,read_info->filename) != 0) - (void) RelinquishUniqueFileResource(read_info->filename); - read_info=DestroyImageInfo(read_info); image=DestroyImageList(image); ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); } @@ -254,10 +235,13 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) int yy; + register ssize_t + x; + q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); if (q == (Quantum *) NULL) break; - yy=display_window.min_y+y; + yy=(int) (display_window.min_y+y); if ((yy < data_window.min_y) || (yy > data_window.max_y) || (scanline == (ImfRgba *) NULL)) { @@ -270,7 +254,7 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) break; continue; } - memset(scanline,0,columns*sizeof(*scanline)); + (void) memset(scanline,0,columns*sizeof(*scanline)); ImfInputSetFrameBuffer(file,scanline-data_window.min_x-columns*yy,1, columns); ImfInputReadPixels(file,yy,yy); @@ -279,7 +263,7 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) int xx; - xx=display_window.min_x+((int) x-data_window.min_x); + xx=(int) (display_window.min_x+x-data_window.min_x); if ((xx < 0) || (display_window.min_x+(int) x > data_window.max_x)) SetPixelViaPixelInfo(image,&image->background_color,q); else @@ -300,9 +284,6 @@ static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception) } scanline=(ImfRgba *) RelinquishMagickMemory(scanline); (void) ImfCloseInputFile(file); - if (LocaleCompare(image_info->filename,read_info->filename) != 0) - (void) RelinquishUniqueFileResource(read_info->filename); - read_info=DestroyImageInfo(read_info); (void) CloseBlob(image); return(GetFirstImageInList(image)); } @@ -342,6 +323,7 @@ ModuleExport size_t RegisterEXRImage(void) entry->encoder=(EncodeImageHandler *) WriteEXRImage; #endif entry->magick=(IsImageFormatHandler *) IsEXR; + entry->flags|=CoderDecoderSeekableStreamFlag; entry->flags^=CoderAdjoinFlag; entry->flags^=CoderBlobSupportFlag; (void) RegisterMagickInfo(entry); -- 2.40.0