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. */
}
ThrowReaderException(CoderError,
"MultidimensionalMatricesAreNotSupported");
}
- Frames = ReadBlobXXXLong(image2);
- if (Frames == 0)
- {
- if (clone_info != (ImageInfo *) NULL)
- clone_info=DestroyImageInfo(clone_info);
- if ((image != image2) && (image2 != (Image *) NULL))
- image2=DestroyImage(image2);
- ThrowReaderException(CorruptImageError,"ImproperImageHeader");
- }
+ Frames = ReadBlobXXXLong(image2);
+ if (Frames == 0)
+ {
+ if (clone_info != (ImageInfo *) NULL)
+ clone_info=DestroyImageInfo(clone_info);
+ if ((image != image2) && (image2 != (Image *) NULL))
+ image2=DestroyImage(image2);
+ ThrowReaderException(CorruptImageError,"ImproperImageHeader");
+ }
+ if (AcquireMagickResource(ListLengthResource,Frames) == MagickFalse)
+ {
+ if (clone_info != (ImageInfo *) NULL)
+ clone_info=DestroyImageInfo(clone_info);
+ if ((image != image2) && (image2 != (Image *) NULL))
+ image2=DestroyImage(image2);
+ ThrowReaderException(ResourceLimitError,"ListLengthExceedsLimit");
+ }
break;
default:
if (clone_info != (ImageInfo *) NULL)
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->depth = 32; /* double type cell */
(void) SetImageOption(clone_info,"quantum:format","floating-point");
if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX)
- { /* complex float type cell */
- }
+ { /* complex float type cell */
+ }
ldblk = (ssize_t) (4 * MATLAB_HDR.SizeX);
break;
case miDOUBLE:
ThrowReaderException(CoderError, "IncompatibleSizeOfDouble");
}
if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX)
- { /* complex double type cell */
- }
+ { /* complex double type cell */
+ }
ldblk = (ssize_t) (8 * MATLAB_HDR.SizeX);
break;
default:
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) &&
MinVal = 0;
MaxVal = 0;
if (CellType==miDOUBLE || CellType==miSINGLE) /* Find Min and Max Values for floats */
- {
- CalcMinMax(image2, image_info->endian, MATLAB_HDR.SizeX, MATLAB_HDR.SizeY, CellType, ldblk, BImgBuff, &quantum_info->minimum, &quantum_info->maximum);
- }
+ {
+ CalcMinMax(image2,image_info->endian,MATLAB_HDR.SizeX,MATLAB_HDR.SizeY,
+ CellType,ldblk,BImgBuff,&quantum_info->minimum,
+ &quantum_info->maximum);
+ }
/* Main loop for reading all scanlines */
if(z==1) z=0; /* read grey scanlines */
{
q=GetAuthenticPixels(image,0,MATLAB_HDR.SizeY-i-1,image->columns,1,exception);
if (q == (Quantum *) NULL)
- {
- if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
+ {
+ if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
" MAT set image pixels returns unexpected NULL on a row %u.", (unsigned)(MATLAB_HDR.SizeY-i-1));
- goto done_reading; /* Skip image rotation, when cannot set image pixels */
- }
+ goto done_reading; /* Skip image rotation, when cannot set image pixels */
+ }
if(ReadBlob(image2,ldblk,(unsigned char *)BImgBuff) != (ssize_t) ldblk)
- {
- if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
- " MAT cannot read scanrow %u from a file.", (unsigned)(MATLAB_HDR.SizeY-i-1));
- goto ExitLoop;
- }
+ {
+ if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
+ " MAT cannot read scanrow %u from a file.", (unsigned)(MATLAB_HDR.SizeY-i-1));
+ goto ExitLoop;
+ }
if((CellType==miINT8 || CellType==miUINT8) && (MATLAB_HDR.StructureFlag & FLAG_LOGICAL))
{
FixLogical((unsigned char *)BImgBuff,ldblk);
if(ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,z2qtype[z],BImgBuff,exception) <= 0)
- {
+ {
ImportQuantumPixelsFailed:
- if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
- " MAT failed to ImportQuantumPixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1));
- break;
- }
+ if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
+ " MAT failed to ImportQuantumPixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1));
+ break;
+ }
}
else
{
if(ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,z2qtype[z],BImgBuff,exception) <= 0)
- goto ImportQuantumPixelsFailed;
+ goto ImportQuantumPixelsFailed;
if (z<=1 && /* fix only during a last pass z==0 || z==1 */
- (CellType==miINT8 || CellType==miINT16 || CellType==miINT32 || CellType==miINT64))
- FixSignedValues(image,q,MATLAB_HDR.SizeX);
+ (CellType==miINT8 || CellType==miINT16 || CellType==miINT32 || CellType==miINT64))
+ FixSignedValues(image,q,MATLAB_HDR.SizeX);
}
if (!SyncAuthenticPixels(image,exception))
- {
- if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
- " MAT failed to sync image pixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1));
- goto ExitLoop;
- }
+ {
+ if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),
+ " MAT failed to sync image pixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1));
+ goto ExitLoop;
+ }
}
} while(z-- >= 2);
ExitLoop:
if (CellType==miDOUBLE)
for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++)
- {
+ {
ReadBlobDoublesXXX(image2, ldblk, (double *)BImgBuff);
InsertComplexDoubleRow(image, (double *)BImgBuff, i, MinVal, MaxVal,
exception);
- }
+ }
if (CellType==miSINGLE)
for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++)
- {
+ {
ReadBlobFloatsXXX(image2, ldblk, (float *)BImgBuff);
InsertComplexFloatRow(image,(float *)BImgBuff,i,MinVal,MaxVal,
exception);
- }
+ }
}
/* Image is gray when no complex flag is set and 2D Matrix AGAIN!!! */
if(image2!=image)
{
DeleteImageFromList(&image2);
- if(clone_info)
- {
+ if(clone_info)
+ {
if(clone_info->file)
- {
+ {
fclose(clone_info->file);
clone_info->file = NULL;
(void) remove_utf8(clone_info->filename);
- }
+ }
}
}
if (EOFBlob(image) != MagickFalse)
(void) remove_utf8(clone_info->filename);
}
}
- }
+ }
if (clone_info)
clone_info=DestroyImageInfo(clone_info);
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);