Commit 81e0b7e7c for imagemagick.org
commit 81e0b7e7c01553aefa986a671389369343361780
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Sun Nov 8 14:55:08 2026 +0100
Refactor how we write the IPL image and add error checks for failing writes.
diff --git a/coders/ipl.c b/coders/ipl.c
index 79d4ecf86..ed2891d93 100644
--- a/coders/ipl.c
+++ b/coders/ipl.c
@@ -505,6 +505,42 @@ ModuleExport void UnregisterIPLImage(void)
% o exception: return any errors or warnings in this structure.
%
*/
+static MagickBooleanType WriteIPLFrame(Image *image,QuantumInfo *quantum_info,
+ const QuantumType quantum_type,const size_t rows,ExceptionInfo *exception)
+{
+ const Quantum
+ *p;
+
+ size_t
+ length;
+
+ ssize_t
+ y;
+
+ unsigned char
+ *pixels;
+
+ pixels=(unsigned char *) GetQuantumPixels(quantum_info);
+ for (y=0; y < (ssize_t) rows; y++)
+ {
+ p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+ if (p == (const Quantum *) NULL)
+ break;
+ (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
+ quantum_type,pixels,exception);
+ length=image->columns*image->depth/8;
+ if (WriteBlob(image,length,pixels) != (ssize_t) length)
+ return(MagickFalse);
+ if ((quantum_type == BlueQuantum) && (image->previous == (Image *) NULL))
+ {
+ if (SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+ image->rows) == MagickFalse)
+ return(MagickFalse);
+ }
+ }
+ return(MagickTrue);
+}
+
static MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image,
ExceptionInfo *exception)
{
@@ -517,21 +553,12 @@ static MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image,
MagickOffsetType
scene;
- const Quantum
- *p;
-
QuantumInfo
*quantum_info;
size_t
number_scenes;
- ssize_t
- y;
-
- unsigned char
- *pixels;
-
/*
Open output image file.
*/
@@ -641,59 +668,30 @@ static MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image,
image->filename);
break;
}
- pixels=(unsigned char *) GetQuantumPixels(quantum_info);
if (ipl_info.colors == 1)
{
- /* Red frame */
- for (y=0; y < (ssize_t) ipl_info.height; y++)
- {
- p=GetVirtualPixels(image,0,y,image->columns,1,exception);
- if (p == (const Quantum *) NULL)
- break;
- (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
- GrayQuantum,pixels,exception);
- (void) WriteBlob(image,image->columns*image->depth/8,pixels);
- }
+ status=WriteIPLFrame(image,quantum_info,GrayQuantum,ipl_info.height,
+ exception);
+ if (status == MagickFalse)
+ break;
}
if (ipl_info.colors == 3)
{
/* Red frame */
- for (y=0; y < (ssize_t) ipl_info.height; y++)
- {
- p=GetVirtualPixels(image,0,y,image->columns,1,exception);
- if (p == (const Quantum *) NULL)
- break;
- (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
- RedQuantum,pixels,exception);
- (void) WriteBlob(image,image->columns*image->depth/8,pixels);
- }
+ status=WriteIPLFrame(image,quantum_info,RedQuantum,ipl_info.height,
+ exception);
+ if (status == MagickFalse)
+ break;
/* Green frame */
- for (y=0; y < (ssize_t) ipl_info.height; y++)
- {
- p=GetVirtualPixels(image,0,y,image->columns,1,exception);
- if (p == (const Quantum *) NULL)
- break;
- (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
- GreenQuantum,pixels,exception);
- (void) WriteBlob(image,image->columns*image->depth/8,pixels);
- }
+ status=WriteIPLFrame(image,quantum_info,GreenQuantum,ipl_info.height,
+ exception);
+ if (status == MagickFalse)
+ break;
/* Blue frame */
- for (y=0; y < (ssize_t) ipl_info.height; y++)
- {
- p=GetVirtualPixels(image,0,y,image->columns,1,exception);
- if (p == (const Quantum *) NULL)
- break;
- (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
- BlueQuantum,pixels,exception);
- (void) WriteBlob(image,image->columns*image->depth/8,pixels);
- if (image->previous == (Image *) NULL)
- {
- status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
- image->rows);
- if (status == MagickFalse)
- break;
- }
- }
+ status=WriteIPLFrame(image,quantum_info,BlueQuantum,ipl_info.height,
+ exception);
+ if (status == MagickFalse)
+ break;
}
if (GetNextImageInList(image) == (Image *) NULL)
break;
@@ -703,8 +701,12 @@ static MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image,
break;
} while (image_info->adjoin != MagickFalse);
quantum_info=DestroyQuantumInfo(quantum_info);
- (void) WriteBlob(image,4,(const unsigned char *) "fini");
- (void) WriteBlobLong(image,0);
- CloseBlob(image);
- return(MagickTrue);
+ if (status != MagickFalse)
+ {
+ (void) WriteBlob(image,4,(const unsigned char *) "fini");
+ (void) WriteBlobLong(image,0);
+ }
+ if (CloseBlob(image) == MagickFalse)
+ status=MagickFalse;
+ return(status);
}