#if defined(MAGICKCORE_OPENEXR_DELEGATE)
#include <ImfCRgbaFile.h>
\f
+/*
+ Typedef declaractions.
+*/
+typedef struct _ExrWindow
+{
+ int
+ max_x,
+ max_y,
+ min_x,
+ min_y;
+} ExrWindow;
+
/*
Forward declarations.
*/
*/
static Image *ReadEXRImage(const ImageInfo *image_info,ExceptionInfo *exception)
{
+ ExrWindow
+ data_window,
+ display_window;
+
const ImfHeader
*hdr_info;
ImfRgba
*scanline;
- int
- max_x,
- max_y,
- min_x,
- min_y;
-
MagickBooleanType
status;
*q;
ssize_t
+ columns,
y;
/*
return((Image *) NULL);
}
hdr_info=ImfInputHeader(file);
- ImfHeaderDisplayWindow(hdr_info,&min_x,&min_y,&max_x,&max_y);
- image->columns=max_x-min_x+1UL;
- image->rows=max_y-min_y+1UL;
+ 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->alpha_trait=BlendPixelTrait;
SetImageColorspace(image,RGBColorspace,exception);
image->gamma=1.0;
status=SetImageExtent(image,image->columns,image->rows,exception);
if (status == MagickFalse)
return(DestroyImageList(image));
- scanline=(ImfRgba *) AcquireQuantumMemory(image->columns,sizeof(*scanline));
- if (scanline == (ImfRgba *) NULL)
+ 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;
+ if ((display_window.min_x > data_window.max_x) ||
+ (display_window.min_x+(int) image->columns <= data_window.min_x))
+ scanline=(ImfRgba *) NULL;
+ else
{
- (void) ImfCloseInputFile(file);
- if (LocaleCompare(image_info->filename,read_info->filename) != 0)
- (void) RelinquishUniqueFileResource(read_info->filename);
- read_info=DestroyImageInfo(read_info);
- ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ scanline=(ImfRgba *) AcquireQuantumMemory(columns,sizeof(*scanline));
+ 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);
+ ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ }
}
for (y=0; y < (ssize_t) image->rows; y++)
{
+ int
+ yy;
+
q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
break;
- ResetMagickMemory(scanline,0,image->columns*sizeof(*scanline));
- ImfInputSetFrameBuffer(file,scanline-min_x-image->columns*(min_y+y),1,
- image->columns);
- ImfInputReadPixels(file,min_y+y,min_y+y);
+ yy=display_window.min_y+y;
+ if ((yy < data_window.min_y) || (yy > data_window.max_y) ||
+ (scanline == (ImfRgba *) NULL))
+ {
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ SetPixelViaPixelInfo(image,&image->background_color,q);
+ q+=GetPixelChannels(image);
+ }
+ continue;
+ }
+ ResetMagickMemory(scanline,0,columns*sizeof(*scanline));
+ ImfInputSetFrameBuffer(file,scanline-data_window.min_x-columns*yy,1,
+ columns);
+ ImfInputReadPixels(file,yy,yy);
for (x=0; x < (ssize_t) image->columns; x++)
{
- SetPixelRed(image,ClampToQuantum(QuantumRange*
- ImfHalfToFloat(scanline[x].r)),q);
- SetPixelGreen(image,ClampToQuantum(QuantumRange*
- ImfHalfToFloat(scanline[x].g)),q);
- SetPixelBlue(image,ClampToQuantum(QuantumRange*
- ImfHalfToFloat(scanline[x].b)),q);
- SetPixelAlpha(image,ClampToQuantum(QuantumRange*
- ImfHalfToFloat(scanline[x].a)),q);
+ int
+ xx;
+
+ xx=display_window.min_x+((int) 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
+ {
+ SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
+ ImfHalfToFloat(scanline[xx].r)),q);
+ SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
+ ImfHalfToFloat(scanline[xx].g)),q);
+ SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
+ ImfHalfToFloat(scanline[xx].b)),q);
+ SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
+ ImfHalfToFloat(scanline[xx].a)),q);
+ }
q+=GetPixelChannels(image);
}
if (SyncAuthenticPixels(image,exception) == MagickFalse)