char identific[124];
unsigned short Version;
char EndianIndicator[2];
- unsigned long DataType;
+ unsigned int DataType;
unsigned int ObjectSize;
- unsigned long unknown1;
- unsigned long unknown2;
+ unsigned int unknown1;
+ unsigned int unknown2;
unsigned short unknown5;
unsigned char StructureFlag;
unsigned char StructureClass;
- unsigned long unknown3;
- unsigned long unknown4;
- unsigned long DimFlag;
+ unsigned int unknown3;
+ unsigned int unknown4;
+ unsigned int DimFlag;
- unsigned long SizeX;
- unsigned long SizeY;
+ unsigned int SizeX;
+ unsigned int SizeY;
unsigned short Flag1;
unsigned short NameFlag;
}
static const QuantumType z2qtype[4] = {GrayQuantum, BlueQuantum, GreenQuantum, RedQuantum};
-
static void InsertComplexDoubleRow(Image *image,double *p,int y,double MinVal,
double MaxVal,ExceptionInfo *exception)
{
-
double f;
int x;
register Quantum *q;
- if (MinVal == 0)
+ if (MinVal >= 0)
MinVal = -1;
- if (MaxVal == 0)
+ if (MaxVal <= 0)
MaxVal = 1;
q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
for (x = 0; x < (ssize_t) image->columns; x++)
{
if (*p > 0)
- {
- f = (*p / MaxVal) * (QuantumRange-GetPixelRed(image,q));
- if (f + GetPixelRed(image,q) > QuantumRange)
- SetPixelRed(image,QuantumRange,q);
- else
- SetPixelRed(image,GetPixelRed(image,q)+(int) f,q);
- if ((int) f / 2.0 > GetPixelGreen(image,q))
- {
- SetPixelGreen(image,0,q);
- SetPixelBlue(image,0,q);
- }
- else
- {
- SetPixelBlue(image,GetPixelBlue(image,q)-(int) (f/2.0),q);
- SetPixelGreen(image,GetPixelBlue(image,q),q);
- }
- }
+ {
+ f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelRed(image,q));
+ if ((f+GetPixelRed(image,q)) >= QuantumRange)
+ SetPixelRed(image,QuantumRange,q);
+ else
+ SetPixelRed(image,GetPixelRed(image,q)+ClampToQuantum(f),q);
+ f=GetPixelGreen(image,q)-f/2.0;
+ if (f <= 0.0)
+ {
+ SetPixelGreen(image,0,q);
+ SetPixelBlue(image,0,q);
+ }
+ else
+ {
+ SetPixelBlue(image,ClampToQuantum(f),q);
+ SetPixelGreen(image,ClampToQuantum(f),q);
+ }
+ }
if (*p < 0)
- {
- f = (*p / MinVal) * (QuantumRange-GetPixelBlue(image,q));
- if (f+GetPixelBlue(image,q) > QuantumRange)
- SetPixelBlue(image,QuantumRange,q);
- else
- SetPixelBlue(image,GetPixelBlue(image,q)+(int) f,q);
- if ((int) f / 2.0 > GetPixelGreen(image,q))
- {
- SetPixelRed(image,0,q);
- SetPixelGreen(image,0,q);
- }
- else
- {
- SetPixelRed(image,GetPixelRed(image,q)-(int) (f/2.0),q);
- SetPixelGreen(image,GetPixelRed(image,q),q);
- }
- }
+ {
+ f=(*p/MinVal)*(Quantum) (QuantumRange-GetPixelBlue(image,q));
+ if ((f+GetPixelBlue(image,q)) >= QuantumRange)
+ SetPixelBlue(image,QuantumRange,q);
+ else
+ SetPixelBlue(image,GetPixelBlue(image,q)+ClampToQuantum(f),q);
+ f=GetPixelGreen(image,q)-f/2.0;
+ if (f <= 0.0)
+ {
+ SetPixelRed(image,0,q);
+ SetPixelGreen(image,0,q);
+ }
+ else
+ {
+ SetPixelRed(image,ClampToQuantum(f),q);
+ SetPixelGreen(image,ClampToQuantum(f),q);
+ }
+ }
p++;
- q+=GetPixelChannels(image);
+ q++;
}
if (!SyncAuthenticPixels(image,exception))
return;
return;
}
-
static void InsertComplexFloatRow(Image *image,float *p,int y,double MinVal,
double MaxVal,ExceptionInfo *exception)
{
int x;
register Quantum *q;
- if (MinVal == 0)
+ if (MinVal >= 0)
MinVal = -1;
- if (MaxVal == 0)
+ if (MaxVal <= 0)
MaxVal = 1;
q = QueueAuthenticPixels(image, 0, y, image->columns, 1,exception);
for (x = 0; x < (ssize_t) image->columns; x++)
{
if (*p > 0)
- {
- f = (*p / MaxVal) * (QuantumRange-GetPixelRed(image,q));
- if (f+GetPixelRed(image,q) > QuantumRange)
- SetPixelRed(image,QuantumRange,q);
- else
- SetPixelRed(image,GetPixelRed(image,q)+(int) f,q);
- if ((int) f / 2.0 > GetPixelGreen(image,q))
- {
- SetPixelGreen(image,0,q);
- SetPixelBlue(image,0,q);
- }
- else
- {
- SetPixelBlue(image,GetPixelBlue(image,q)-(int) (f/2.0),q);
- SetPixelGreen(image,GetPixelBlue(image,q),q);
- }
- }
+ {
+ f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelRed(image,q));
+ if ((f+GetPixelRed(image,q)) < QuantumRange)
+ SetPixelRed(image,GetPixelRed(image,q)+ClampToQuantum(f),q);
+ else
+ SetPixelRed(image,QuantumRange,q);
+ f/=2.0;
+ if (f < GetPixelGreen(image,q))
+ {
+ SetPixelBlue(image,GetPixelBlue(image,q)-ClampToQuantum(f),q);
+ SetPixelGreen(image,GetPixelBlue(image,q),q);
+ }
+ else
+ {
+ SetPixelGreen(image,0,q);
+ SetPixelBlue(image,0,q);
+ }
+ }
if (*p < 0)
- {
- f = (*p / MaxVal) * (QuantumRange - GetPixelBlue(image,q));
- if (f + GetPixelBlue(image,q) > QuantumRange)
- SetPixelBlue(image,QuantumRange,q);
- else
- SetPixelBlue(image,GetPixelBlue(image,q)+
- (int) f,q);
- if ((int) f / 2.0 > GetPixelGreen(image,q))
- {
- SetPixelGreen(image,0,q);
- SetPixelRed(image,0,q);
- }
- else
- {
- SetPixelRed(image,GetPixelRed(image,q)-(int) (f/2.0),q);
- SetPixelGreen(image,GetPixelRed(image,q),q);
- }
- }
+ {
+ f=(*p/MaxVal)*(Quantum) (QuantumRange-GetPixelBlue(image,q));
+ if ((f > 0) && ((f+GetPixelBlue(image,q)) < QuantumRange))
+ SetPixelBlue(image,GetPixelBlue(image,q)+ClampToQuantum(f),q);
+ else
+ SetPixelBlue(image,QuantumRange,q);
+ f/=2.0;
+ if (f < GetPixelGreen(image,q))
+ {
+ SetPixelRed(image,GetPixelRed(image,q)-ClampToQuantum(f),q);
+ SetPixelGreen(image,GetPixelRed(image,q),q);
+ }
+ else
+ {
+ SetPixelGreen(image,0,q);
+ SetPixelRed(image,0,q);
+ }
+ }
p++;
q++;
}
unsigned int
depth;
-
quantum_info=(QuantumInfo *) NULL;
(void) SeekBlob(image,0,SEEK_SET);
+ status=MagickTrue;
while (EOFBlob(image) == MagickFalse)
{
/*
if ((HDR.imagf != 0) && (HDR.imagf != 1))
break;
if (HDR.nameLen > 0xFFFF)
- return((Image *) NULL);
+ return(DestroyImageList(image));
for (i=0; i < (ssize_t) HDR.nameLen; i++)
{
int
image->columns=(size_t) HDR.nRows;
image->rows=(size_t) HDR.nCols;
if ((image->columns == 0) || (image->rows == 0))
- return(image);
+ return(DestroyImageList(image));
if (image_info->ping != MagickFalse)
{
Swap(image->columns,image->rows);
if(HDR.imagf==1) ldblk *= 2;
SeekBlob(image, HDR.nCols*ldblk, SEEK_CUR);
- if ((image->columns == 0) || (image->rows == 0))
- return(image->previous == (Image *) NULL ? (Image *) NULL : image);
+ if ((image->columns == 0) || (image->rows == 0))
+ return(image->previous == (Image *) NULL ? DestroyImageList(image)
+ : image);
goto skip_reading_current;
}
status=SetImageExtent(image,image->columns,image->rows,exception);
if (status == MagickFalse)
- return((Image *) NULL);
+ return(DestroyImageList(image));
(void) SetImageBackgroundColor(image,exception);
(void) SetImageColorspace(image,GRAYColorspace,exception);
quantum_info=AcquireQuantumInfo(image_info,image);
if (quantum_info == (QuantumInfo *) NULL)
- return((Image *) NULL);
+ return(DestroyImageList(image));
switch(HDR.Type[1])
{
case 0:
AcquireNextImage(image_info,image,exception);
if (GetNextImageInList(image) == (Image *) NULL)
{
- image=DestroyImageList(image);
- return((Image *) NULL);
+ status=MagickFalse;
+ break;
}
image=SyncNextImageInList(image);
status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
break;
}
(void) CloseBlob(image);
+ if (status == MagickFalse)
+ return(DestroyImageList(image));
return(GetFirstImageInList(image));
}
\f
ThrowReaderException(CorruptImageError,"ImproperImageHeader");
if (strncmp(MATLAB_HDR.identific,"MATLAB",6) != 0)
{
- image2=ReadMATImageV4(image_info,image,exception);
- if (image2 == NULL)
- goto MATLAB_KO;
- image=image2;
+ image=ReadMATImageV4(image_info,image,exception);
+ if (image == NULL)
+ {
+ if ((image != image2) && (image2 != (Image *) NULL))
+ image2=DestroyImage(image2);
+ if (clone_info != (ImageInfo *) NULL)
+ clone_info=DestroyImageInfo(clone_info);
+ return((Image *) NULL);
+ }
goto END_OF_READING;
}
MATLAB_HDR.Version = ReadBlobLSBShort(image);
while(!EOFBlob(image)) /* object parser loop */
{
Frames = 1;
+ if (filepos != (unsigned int) filepos)
+ break;
if(SeekBlob(image,filepos,SEEK_SET) != filepos) break;
/* printf("pos=%X\n",TellBlob(image)); */
if(EOFBlob(image)) break;
if((MagickSizeType) (MATLAB_HDR.ObjectSize+filepos) > GetBlobSize(image))
goto MATLAB_KO;
- filepos += MATLAB_HDR.ObjectSize + 4 + 4;
+ filepos += (MagickOffsetType) MATLAB_HDR.ObjectSize + 4 + 4;
if (clone_info != (ImageInfo *) NULL)
clone_info=DestroyImageInfo(clone_info);
}
#endif
- if (MATLAB_HDR.DataType!=miMATRIX)
+ if (MATLAB_HDR.DataType != miMATRIX)
{
clone_info=DestroyImageInfo(clone_info);
+#if defined(MAGICKCORE_ZLIB_DELEGATE)
+ if (image2 != image)
+ DeleteImageFromList(&image2);
+#endif
continue; /* skip another objects. */
}
MATLAB_HDR.StructureClass != mxINT64_CLASS &&
MATLAB_HDR.StructureClass != mxUINT64_CLASS) /* uint64 + uint64 3D */
{
- if ((image2 != (Image*) NULL) && (image2 != (Image *) image))
+ if ((image2 != (Image*) NULL) && (image2 != image))
{
CloseBlob(image2);
DeleteImageFromList(&image2);
{
case 0:
size = ReadBlobXXXLong(image2); /* Object name string size */
- size = 4 * (ssize_t) ((size + 3 + 1) / 4);
+ size = 4 * (((size_t) size + 3 + 1) / 4);
(void) SeekBlob(image2, size, SEEK_CUR);
break;
case 1:
(void) LogMagickEvent(CoderEvent,GetMagickModule(),
"MATLAB_HDR.CellType: %.20g",(double) CellType);
- (void) ReadBlob(image2, 4, (unsigned char *) &size); /* data size */
+ /* data size */
+ if (ReadBlob(image2, 4, (unsigned char *) &size) != 4)
+ goto MATLAB_KO;
NEXT_FRAME:
switch (CellType)
image->colors = GetQuantumRange(image->depth);
if (image->columns == 0 || image->rows == 0)
goto MATLAB_KO;
- if((unsigned long)ldblk*MATLAB_HDR.SizeY > MATLAB_HDR.ObjectSize)
+ if((unsigned int)ldblk*MATLAB_HDR.SizeY > MATLAB_HDR.ObjectSize)
goto MATLAB_KO;
/* Image is gray when no complex flag is set and 2D Matrix */
if ((MATLAB_HDR.DimFlag == 8) &&
MagickOffsetType
scene;
+ size_t
+ imageListLength;
+
struct tm
local_time;
MATLAB_HDR[0x7F]='M';
(void) WriteBlob(image,sizeof(MATLAB_HDR),(unsigned char *) MATLAB_HDR);
scene=0;
+ imageListLength=GetImageListLength(image);
do
{
char
if (GetNextImageInList(image) == (Image *) NULL)
break;
image=SyncNextImageInList(image);
- status=SetImageProgress(image,SaveImagesTag,scene++,
- GetImageListLength(image));
+ status=SetImageProgress(image,SaveImagesTag,scene++,imageListLength);
if (status == MagickFalse)
break;
} while (image_info->adjoin != MagickFalse);