Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
GraphicsMagick.8039
GraphicsMagick-mat.c-update.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File GraphicsMagick-mat.c-update.patch of Package GraphicsMagick.8039
Index: GraphicsMagick-1.3.25/coders/mat.c =================================================================== --- GraphicsMagick-1.3.25.orig/coders/mat.c 2018-01-08 13:32:01.394340606 +0100 +++ GraphicsMagick-1.3.25/coders/mat.c 2018-01-08 13:33:02.951348262 +0100 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003 - 2016 GraphicsMagick Group +% Copyright (C) 2003 - 2017 GraphicsMagick Group % Copyright (C) 2002 ImageMagick Studio % % This program is covered by multiple licenses, which are described in @@ -67,7 +67,7 @@ typedef struct unsigned short Version; char EndianIndicator[2]; unsigned long DataType; - unsigned long ObjectSize; + magick_uint32_t ObjectSize; unsigned long unknown1; unsigned long unknown2; @@ -100,43 +100,43 @@ static const char *OsDesc= typedef enum { - miINT8 = 1, /* 8 bit signed */ - miUINT8, /* 8 bit unsigned */ - miINT16, /* 16 bit signed */ - miUINT16, /* 16 bit unsigned */ - miINT32, /* 32 bit signed */ - miUINT32, /* 32 bit unsigned */ - miSINGLE, /* IEEE 754 single precision float */ + miINT8 = 1, /* 8 bit signed */ + miUINT8, /* 8 bit unsigned */ + miINT16, /* 16 bit signed */ + miUINT16, /* 16 bit unsigned */ + miINT32, /* 32 bit signed */ + miUINT32, /* 32 bit unsigned */ + miSINGLE, /* IEEE 754 single precision float */ miRESERVE1, - miDOUBLE, /* IEEE 754 double precision float */ + miDOUBLE, /* IEEE 754 double precision float */ miRESERVE2, miRESERVE3, - miINT64, /* 64 bit signed */ - miUINT64, /* 64 bit unsigned */ - miMATRIX, /* MATLAB array */ - miCOMPRESSED, /* Compressed Data */ - miUTF8, /* Unicode UTF-8 Encoded Character Data */ - miUTF16, /* Unicode UTF-16 Encoded Character Data */ - miUTF32 /* Unicode UTF-32 Encoded Character Data */ + miINT64, /* 64 bit signed */ + miUINT64, /* 64 bit unsigned */ + miMATRIX, /* MATLAB array */ + miCOMPRESSED, /* Compressed Data */ + miUTF8, /* Unicode UTF-8 Encoded Character Data */ + miUTF16, /* Unicode UTF-16 Encoded Character Data */ + miUTF32 /* Unicode UTF-32 Encoded Character Data */ } mat5_data_type; typedef enum { - mxCELL_CLASS=1, /* cell array */ - mxSTRUCT_CLASS, /* structure */ - mxOBJECT_CLASS, /* object */ - mxCHAR_CLASS, /* character array */ - mxSPARSE_CLASS, /* sparse array */ - mxDOUBLE_CLASS, /* double precision array */ - mxSINGLE_CLASS, /* single precision floating point */ - mxINT8_CLASS, /* 8 bit signed integer */ - mxUINT8_CLASS, /* 8 bit unsigned integer */ - mxINT16_CLASS, /* 16 bit signed integer */ - mxUINT16_CLASS, /* 16 bit unsigned integer */ - mxINT32_CLASS, /* 32 bit signed integer */ - mxUINT32_CLASS, /* 32 bit unsigned integer */ - mxINT64_CLASS, /* 64 bit signed integer */ - mxUINT64_CLASS, /* 64 bit unsigned integer */ + mxCELL_CLASS=1, /* cell array */ + mxSTRUCT_CLASS, /* structure */ + mxOBJECT_CLASS, /* object */ + mxCHAR_CLASS, /* character array */ + mxSPARSE_CLASS, /* sparse array */ + mxDOUBLE_CLASS, /* double precision array */ + mxSINGLE_CLASS, /* single precision floating point */ + mxINT8_CLASS, /* 8 bit signed integer */ + mxUINT8_CLASS, /* 8 bit unsigned integer */ + mxINT16_CLASS, /* 16 bit signed integer */ + mxUINT16_CLASS, /* 16 bit unsigned integer */ + mxINT32_CLASS, /* 32 bit signed integer */ + mxUINT32_CLASS, /* 32 bit unsigned integer */ + mxINT64_CLASS, /* 64 bit signed integer */ + mxUINT64_CLASS, /* 64 bit unsigned integer */ mxFUNCTION_CLASS /* Function handle */ } arrayclasstype; @@ -262,8 +262,8 @@ static void FixSignedValues(PixelPacket while(y-->0) { /* Please note that negative values will overflow - Q=8; MaxRGB=255: <0;127> + 127+1 = <128; 255> - <-1;-128> + 127+1 = <0; 127> */ + Q=8; MaxRGB=255: <0;127> + 127+1 = <128; 255> + <-1;-128> + 127+1 = <0; 127> */ q->red += MaxRGB/2 + 1; q->green += MaxRGB/ + 1; q->blue += MaxRGB/ + 1; @@ -282,7 +282,7 @@ unsigned char val = 0; while(ldblk-->0) { if(*Buff++ != 0) - val |= mask; + val |= mask; mask >>= 1; if(mask==0) @@ -290,8 +290,8 @@ unsigned char val = 0; *BuffL++ = val; val = 0; mask = 128; - } - + } + } *BuffL = val; } @@ -309,7 +309,7 @@ static void ZLIBFreeFunc(voidpf opaque, } /** This procedure decompreses an image block for a new MATLAB format. */ -static Image *DecompressBlock(Image *orig, magick_off_t Size, ImageInfo *clone_info, ExceptionInfo *exception) +static Image *DecompressBlock(Image *orig, magick_uint32_t *Size, ImageInfo *clone_info, ExceptionInfo *exception) { Image *image2; void *cache_block, *decompress_block; @@ -317,22 +317,23 @@ z_stream zip_info; FILE *mat_file; size_t magick_size; int status; - int zip_status; +int zip_status; +magick_off_t TotalSize = 0; if(clone_info==NULL) return NULL; - if(clone_info->file) /* Close file opened from previous transaction. */ + if(clone_info->file) /* Close file opened from previous transaction. */ { fclose(clone_info->file); clone_info->file = NULL; (void) unlink(clone_info->filename); } - cache_block = MagickAllocateMemory(unsigned char *,(size_t)((Size<16384)?Size:16384)); + cache_block = MagickAllocateMemory(unsigned char *,(size_t)((*Size<16384) ? *Size : 16384)); if(cache_block==NULL) return NULL; decompress_block = MagickAllocateMemory(unsigned char *,(size_t)(4096)); - if(decompress_block==NULL) + if(decompress_block==NULL) { - MagickFreeMemory(cache_block); + MagickFreeMemory(cache_block); return NULL; } @@ -363,54 +364,58 @@ int status; zip_info.avail_in = 0; zip_info.total_out = 0; - while(Size>0 && !EOFBlob(orig)) - { - magick_size = ReadBlob(orig, (Size<16384)?Size:16384, cache_block); + while(*Size>0 && !EOFBlob(orig)) + { + magick_size = ReadBlob(orig, (*Size<16384)?*Size:16384, cache_block); zip_info.next_in = cache_block; - zip_info.avail_in = (uInt) magick_size; + zip_info.avail_in = (uInt) magick_size; while(zip_info.avail_in>0) { - zip_info.avail_out = 4096; + zip_info.avail_out = 4096; zip_info.next_out = decompress_block; zip_status = inflate(&zip_info,Z_NO_FLUSH); if ((zip_status != Z_OK) && (zip_status != Z_STREAM_END)) { (void) LogMagickEvent(CoderEvent,GetMagickModule(),"Corrupt inflate stream"); - ThrowException(exception,CorruptImageError, UnableToUncompressImage, orig->filename); + inflateEnd(&zip_info); MagickFreeMemory(cache_block); MagickFreeMemory(decompress_block); - inflateEnd(&zip_info); (void)fclose(mat_file); LiberateTemporaryFile(clone_info->filename); + ThrowException(exception,CorruptImageError, UnableToUncompressImage, orig->filename); return NULL; } fwrite(decompress_block, 4096-zip_info.avail_out, 1, mat_file); + TotalSize += 4096-zip_info.avail_out; if(zip_status == Z_STREAM_END) goto DblBreak; } - - Size -= magick_size; + if (*Size >= magick_size) + *Size -= (magick_uint32_t) magick_size; + else + *Size = 0U; } DblBreak: - - inflateEnd(&zip_info); /* Release all caches used by zip. */ + + inflateEnd(&zip_info); /* Release all caches used by zip. */ (void)fclose(mat_file); MagickFreeMemory(cache_block); MagickFreeMemory(decompress_block); + *Size = TotalSize; if((clone_info->file=fopen(clone_info->filename,"rb"))==NULL) goto UnlinkFile; - if( (image2 = AllocateImage(clone_info))==NULL ) goto EraseFile; + if((image2 = AllocateImage(clone_info))==NULL) goto EraseFile; status = OpenBlob(clone_info,image2,ReadBinaryBlobMode,exception); if (status == False) { - DeleteImageFromList(&image2); + DeleteImageFromList(&image2); EraseFile: fclose(clone_info->file); clone_info->file = NULL; UnlinkFile: LiberateTemporaryFile(clone_info->filename); - return NULL; + return NULL; } return image2; @@ -426,13 +431,27 @@ UnlinkFile: } +#define ThrowImg2MATReaderException(code_,reason_,image_) \ +{ \ + if(image2!=NULL && image2!=image) /* Does shadow temporary decompressed image exist? */ \ + { \ + CloseBlob(image2); \ + DeleteImageFromList(&image2); \ + } \ + if(clone_info) \ + DestroyImageInfo(clone_info); \ + ThrowReaderException(code_,reason_,image_); \ +} + + + typedef struct { - unsigned char Type[4]; - magick_uint32_t nRows; - magick_uint32_t nCols; - magick_uint32_t imagf; - magick_uint32_t nameLen; + unsigned char Type[4]; + magick_uint32_t nRows; + magick_uint32_t nCols; + magick_uint32_t imagf; + magick_uint32_t nameLen; } MAT4_HDR; @@ -453,208 +472,225 @@ size_t (*ReadBlobXXXDoubles)(Image *imag size_t (*ReadBlobXXXFloats)(Image *image, size_t len, float *data); (void)SeekBlob(image,0,SEEK_SET); - - ldblk = ReadBlobLSBLong(image); - if(ldblk>9999 || ldblk<0) return 0; - HDR.Type[3] = ldblk % 10; ldblk /= 10; /* T digit */ - HDR.Type[2] = ldblk % 10; ldblk /= 10; /* P digit */ - HDR.Type[1] = ldblk % 10; ldblk /= 10; /* O digit */ - HDR.Type[0] = ldblk; /* M digit */ - - if(HDR.Type[3]!=0) return 0; /* Data format */ - if(HDR.Type[2]!=0) return 0; /* Always 0 */ - - ImportPixelAreaOptionsInit(import_options); - - switch(HDR.Type[0]) - { - case 0: ReadBlobXXXLong = ReadBlobLSBLong; - ReadBlobXXXDoubles = ReadBlobLSBDoubles; - ReadBlobXXXFloats = ReadBlobLSBFloats; - import_options->endian = LSBEndian; - break; - case 1: ReadBlobXXXLong = ReadBlobMSBLong; - ReadBlobXXXDoubles = ReadBlobMSBDoubles; - ReadBlobXXXFloats = ReadBlobMSBFloats; - import_options->endian = MSBEndian; - break; - default: return 0; /* Unsupported endian */ - } - - HDR.nRows = ReadBlobXXXLong(image); - HDR.nCols = ReadBlobXXXLong(image); - - HDR.imagf = ReadBlobXXXLong(image); - if(HDR.imagf!=0 && HDR.imagf!=1) return NULL; - - HDR.nameLen = ReadBlobXXXLong(image); - if(HDR.nameLen>0xFFFF) return NULL; - (void)SeekBlob(image,HDR.nameLen,SEEK_CUR); /* Skip a matrix name. */ - - switch(HDR.Type[1]) + while(!EOFBlob(image)) /* object parser loop */ { - case 0: sample_size = 64; /* double-precision (64-bit) floating point numbers */ - image->depth = Min(QuantumDepth,32); /* double type cell */ - import_options->sample_type = FloatQuantumSampleType; - if(sizeof(double) != 8) return NULL; /* incompatible double size */ - ldblk = (long) (8 * HDR.nRows); - break; - - case 1: sample_size = 32; /* single-precision (32-bit) floating point numbers */ - image->depth = Min(QuantumDepth,32); /* double type cell */ - import_options->sample_type = FloatQuantumSampleType; + ldblk = ReadBlobLSBLong(image); + if(EOFBlob(image)) break; + if(ldblk>9999 || ldblk<0) return 0; + HDR.Type[3] = ldblk % 10; ldblk /= 10; /* T digit */ + HDR.Type[2] = ldblk % 10; ldblk /= 10; /* P digit */ + HDR.Type[1] = ldblk % 10; ldblk /= 10; /* O digit */ + HDR.Type[0] = ldblk; /* M digit */ + + if(HDR.Type[3]!=0) return 0; /* Data format */ + if(HDR.Type[2]!=0) return 0; /* Always 0 */ + + ImportPixelAreaOptionsInit(import_options); + + switch(HDR.Type[0]) + { + case 0: ReadBlobXXXLong = ReadBlobLSBLong; + ReadBlobXXXDoubles = ReadBlobLSBDoubles; + ReadBlobXXXFloats = ReadBlobLSBFloats; + import_options->endian = LSBEndian; + break; + case 1: ReadBlobXXXLong = ReadBlobMSBLong; + ReadBlobXXXDoubles = ReadBlobMSBDoubles; + ReadBlobXXXFloats = ReadBlobMSBFloats; + import_options->endian = MSBEndian; + break; + default: return 0; /* Unsupported endian */ + } + + HDR.nRows = ReadBlobXXXLong(image); + HDR.nCols = ReadBlobXXXLong(image); + + HDR.imagf = ReadBlobXXXLong(image); + if(HDR.imagf!=0 && HDR.imagf!=1) return NULL; + + HDR.nameLen = ReadBlobXXXLong(image); + if(HDR.nameLen>0xFFFF) return NULL; + (void)SeekBlob(image,HDR.nameLen,SEEK_CUR); /* Skip a matrix name. */ + + switch(HDR.Type[1]) + { + case 0: sample_size = 64; /* double-precision (64-bit) floating point numbers */ + image->depth = Min(QuantumDepth,32); /* double type cell */ + import_options->sample_type = FloatQuantumSampleType; + if(sizeof(double) != 8) return NULL; /* incompatible double size */ + ldblk = (long) (8 * HDR.nRows); + break; + + case 1: sample_size = 32; /* single-precision (32-bit) floating point numbers */ + image->depth = Min(QuantumDepth,32); /* double type cell */ + import_options->sample_type = FloatQuantumSampleType; #if 0 - if(sizeof(float) != 4) - ThrowMATReaderException(CoderError, IncompatibleSizeOfFloat, image); -#endif - ldblk = (long) (4 * HDR.nRows); - break; + if(sizeof(float) != 4) + ThrowMATReaderException(CoderError, IncompatibleSizeOfFloat, image); +#endif + ldblk = (long) (4 * HDR.nRows); + break; - case 2: sample_size = 32; /* 32-bit signed integers */ - image->depth = Min(QuantumDepth,32); /* Dword type cell */ - ldblk = (long) (4 * HDR.nRows); - import_options->sample_type = UnsignedQuantumSampleType; - break; + case 2: sample_size = 32; /* 32-bit signed integers */ + image->depth = Min(QuantumDepth,32); /* Dword type cell */ + ldblk = (long) (4 * HDR.nRows); + import_options->sample_type = UnsignedQuantumSampleType; + break; + + case 3: /* 16-bit signed integers */ + case 4: /* 16-bit unsigned integers */ + sample_size = 16; + image->depth = Min(QuantumDepth,16); /* Word type cell */ + ldblk = (long) (2 * HDR.nRows); + import_options->sample_type = UnsignedQuantumSampleType; + break; + + case 5: sample_size = 8; /* 8-bit unsigned integers */ + image->depth = Min(QuantumDepth,8); /* Byte type cell */ + import_options->sample_type = UnsignedQuantumSampleType; + ldblk = (long) HDR.nRows; + break; - case 3: /* 16-bit signed integers */ - case 4: /* 16-bit unsigned integers */ - sample_size = 16; - image->depth = Min(QuantumDepth,16); /* Word type cell */ - ldblk = (long) (2 * HDR.nRows); - import_options->sample_type = UnsignedQuantumSampleType; - break; + default: return NULL; + } - case 5: sample_size = 8; /* 8-bit unsigned integers */ - image->depth = Min(QuantumDepth,8); /* Byte type cell */ - import_options->sample_type = UnsignedQuantumSampleType; - ldblk = (long) HDR.nRows; - break; - - default: return NULL; - } - - image->columns = HDR.nRows; - image->rows = HDR.nCols; - image->colors = 1l << image->depth; - if(image->columns == 0 || image->rows == 0) return NULL; - if(CheckImagePixelLimits(image, exception) != MagickPass) - { - return NULL; - /* ThrowReaderException(ResourceLimitError,ImagePixelLimitExceeded,image); */ - } + image->columns = HDR.nRows; + image->rows = HDR.nCols; + image->colors = 1l << image->depth; + if(image->columns == 0 || image->rows == 0) return NULL; + if(CheckImagePixelLimits(image, exception) != MagickPass) + { + return NULL; + /* ThrowReaderException(ResourceLimitError,ImagePixelLimitExceeded,image); */ + } - /* If ping is true, then only set image size and colors without reading any image data. */ - if(image_info->ping) - { - unsigned long temp = image->columns; /* The true image is rotater 90 degs. Do rotation without data. */ - image->columns = image->rows; - image->rows = temp; - goto done_reading; /* !!!!!! BAD !!!! */ - } + /* If ping is true, then only set image size and colors without reading any image data. */ + if(image_info->ping) + { + unsigned long temp = image->columns; /* The true image is rotater 90 degs. Do rotation without data. */ + image->columns = image->rows; + image->rows = temp; + if(HDR.imagf==1) ldblk *= 2; + SeekBlob(image, HDR.nCols*ldblk, SEEK_CUR); + goto skip_reading_current; + } - /* ----- Load raster data ----- */ - BImgBuff = MagickAllocateMemory(unsigned char *,(size_t) (ldblk)); /* Ldblk was set in the check phase */ - if(BImgBuff == NULL) return 0; - - if(HDR.Type[1]==0) /* Find Min and Max Values for doubles */ - { - (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, + /* ----- Load raster data ----- */ + BImgBuff = MagickAllocateMemory(unsigned char *,(size_t) (ldblk)); /* Ldblk was set in the check phase */ + if(BImgBuff == NULL) return 0; + + if(HDR.Type[1]==0) /* Find Min and Max Values for doubles */ + { + (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, HDR.nCols, DoublePixel, ldblk, BImgBuff, - &import_options->double_minvalue, + &import_options->double_minvalue, &import_options->double_maxvalue); - } - if(HDR.Type[1]==1) /* Find Min and Max Values for floats */ - { - (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, - HDR.nCols, FloatPixel, ldblk, BImgBuff, - &import_options->double_minvalue, - &import_options->double_maxvalue); - } - - - /* Main reader loop. */ - for(i=0; i<(long)HDR.nCols; i++) - { - q = SetImagePixels(image, 0, HDR.nCols-i-1, image->columns, 1); - if(q == (PixelPacket *)NULL) + } + if(HDR.Type[1]==1) /* Find Min and Max Values for floats */ { - /* 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 */ + (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, + HDR.nCols, FloatPixel, ldblk, BImgBuff, + &import_options->double_minvalue, + &import_options->double_maxvalue); } - if(ReadBlob(image,ldblk,(char *)BImgBuff) != (size_t)ldblk) + /* Main reader loop. */ + for(i=0; i<(long)HDR.nCols; i++) { - /* if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), */ - /* " MAT cannot read scanrow %u from a file.", (unsigned)(MATLAB_HDR.SizeY-i-1)); */ - goto ExitLoop; - } + q = SetImagePixels(image, 0, HDR.nCols-i-1, image->columns, 1); + if(q == (PixelPacket *)NULL) + { + /* if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), */ + /* " MAT set image pixels returns unexpected NULL on a row %u.", (unsigned)(MATLAB_HDR.SizeY-i-1)); */ + goto skip_reading_current; /* Skip image rotation, when cannot set image pixels */ + } + + if(ReadBlob(image,ldblk,(char *)BImgBuff) != (size_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(ImportImagePixelArea(image,GrayQuantum,sample_size,BImgBuff,import_options,0) == MagickFail) - goto ImportImagePixelAreaFailed; + if(ImportImagePixelArea(image,GrayQuantum,sample_size,BImgBuff,import_options,0) == MagickFail) + goto ImportImagePixelAreaFailed; - if(HDR.Type[1]==2 || HDR.Type[1]==3) - FixSignedValues(q,HDR.nRows); + if(HDR.Type[1]==2 || HDR.Type[1]==3) + FixSignedValues(q,HDR.nRows); - if(!SyncImagePixels(image)) - { - /* if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), */ + if(!SyncImagePixels(image)) + { + /* if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), */ /* " MAT failed to sync image pixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1)); */ - goto ExitLoop; + goto ExitLoop; + } } - } - /* Read complex part of data. */ - if(HDR.imagf==1) - { - MinVal_c = MaxVal_c = 0; - if(HDR.Type[1]==0) /* Find Min and Max Values for doubles */ + /* Read complex part of data. */ + if(HDR.imagf==1) { - (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, + MinVal_c = MaxVal_c = 0; + if(HDR.Type[1]==0) /* Find Min and Max Values for doubles */ + { + (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, HDR.nCols, DoublePixel, ldblk, BImgBuff, &MinVal_c, &MaxVal_c); - for(i=0; i<(long)HDR.nCols; i++) - { - ReadBlobXXXDoubles(image, ldblk, (double *)BImgBuff); - InsertComplexDoubleRow((double *)BImgBuff, i, image, MinVal_c, MaxVal_c); + for(i=0; i<(long)HDR.nCols; i++) + { + ReadBlobXXXDoubles(image, ldblk, (double *)BImgBuff); + InsertComplexDoubleRow((double *)BImgBuff, i, image, MinVal_c, MaxVal_c); + } } - } - if(HDR.Type[1]==1) /* Find Min and Max Values for floats */ - { - (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, + if(HDR.Type[1]==1) /* Find Min and Max Values for floats */ + { + (void)MagickFindRawImageMinMax(image, import_options->endian, HDR.nRows, HDR.nCols, FloatPixel, ldblk, BImgBuff, &MinVal_c, &MaxVal_c); - for(i=0; i<(long)HDR.nCols; i++) - { - ReadBlobXXXFloats(image, ldblk, (float *)BImgBuff); - InsertComplexFloatRow((float *)BImgBuff, i, image, MinVal_c, MaxVal_c); - } + for(i=0; i<(long)HDR.nCols; i++) + { + ReadBlobXXXFloats(image, ldblk, (float *)BImgBuff); + InsertComplexFloatRow((float *)BImgBuff, i, image, MinVal_c, MaxVal_c); + } + } } - } - /* Rotate image. */ - rotated_image = RotateImage(image, 90.0, exception); - if(rotated_image != (Image *) NULL) - { + /* Rotate image. */ + rotated_image = RotateImage(image, 90.0, exception); + if(rotated_image != (Image *) NULL) + { /* Remove page offsets added by RotateImage */ - rotated_image->page.x=0; - rotated_image->page.y=0; + rotated_image->page.x=0; + rotated_image->page.y=0; + + blob = rotated_image->blob; + rotated_image->blob = image->blob; + rotated_image->colors = image->colors; + image->blob = blob; + AppendImageToList(&image,rotated_image); + DeleteImageFromList(&image); + image = rotated_image; + } + +skip_reading_current: + /* Allocate next image structure. */ + AllocateNextImage(image_info,image); + if (image->next == (Image *) NULL) break; + image=SyncNextImageInList(image); + image->columns = image->rows = 0; + image->colors=0; + + /* row scan buffer is no longer needed */ + MagickFreeMemory(BImgBuff); + BImgBuff = NULL; - blob = rotated_image->blob; - rotated_image->blob = image->blob; - rotated_image->colors = image->colors; - image->blob = blob; - AppendImageToList(&image,rotated_image); - DeleteImageFromList(&image); - image = rotated_image; } - + ImportImagePixelAreaFailed: ExitLoop: -done_reading: - MagickFreeMemory(BImgBuff); + if(BImgBuff!=NULL) MagickFreeMemory(BImgBuff); + return image; } @@ -697,7 +733,7 @@ static Image *ReadMATImage(const ImageIn PixelPacket *q; unsigned int status; MATHeader MATLAB_HDR; - unsigned long size; + unsigned long size; magick_uint32_t CellType; ImportPixelAreaOptions import_options; int i; @@ -711,7 +747,7 @@ static Image *ReadMATImage(const ImageIn magick_off_t filepos=0x80; BlobInfo *blob; ImageInfo *clone_info = NULL; - + magick_uint32_t (*ReadBlobXXXLong)(Image *image); magick_uint16_t (*ReadBlobXXXShort)(Image *image); size_t (*ReadBlobXXXDoubles)(Image *image, size_t len, double *data); @@ -721,7 +757,7 @@ static Image *ReadMATImage(const ImageIn assert(image_info->signature == MagickSignature); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); - logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter"); + logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter"); /* Open image file. @@ -730,25 +766,31 @@ static Image *ReadMATImage(const ImageIn status = OpenBlob(image_info, image, ReadBinaryBlobMode, exception); if (status == False) + { ThrowMATReaderException(FileOpenError, UnableToOpenFile, image); + } /* Read MATLAB image. */ if(ReadBlob(image,124,&MATLAB_HDR.identific) != 124) + { ThrowMATReaderException(CorruptImageError,ImproperImageHeader,image); + } if(strncmp(MATLAB_HDR.identific, "MATLAB", 6)) { image2 = ReadMATImageV4(image_info,image,&import_options,exception); if(image2==NULL) goto MATLAB_KO; image = image2; - goto END_OF_READING; + goto END_OF_READING; } MATLAB_HDR.Version = ReadBlobLSBShort(image); if(ReadBlob(image,2,&MATLAB_HDR.EndianIndicator) != 2) + { ThrowMATReaderException(CorruptImageError,ImproperImageHeader,image); + } ImportPixelAreaOptionsInit(&import_options); @@ -761,7 +803,7 @@ static Image *ReadMATImage(const ImageIn ReadBlobXXXDoubles = ReadBlobLSBDoubles; ReadBlobXXXFloats = ReadBlobLSBFloats; import_options.endian = LSBEndian; - } + } else if (!strncmp(MATLAB_HDR.EndianIndicator, "MI", 2)) { ReadBlobXXXLong = ReadBlobMSBLong; @@ -770,14 +812,16 @@ static Image *ReadMATImage(const ImageIn ReadBlobXXXFloats = ReadBlobMSBFloats; import_options.endian = MSBEndian; } - else /* unsupported endian */ + else /* unsupported endian */ { -MATLAB_KO: ThrowMATReaderException(CorruptImageError,ImproperImageHeader,image); +MATLAB_KO: ThrowMATReaderException(CorruptImageError,ImproperImageHeader,image); } filepos = TellBlob(image); if(filepos < 0) - ThrowMATReaderException(BlobError,UnableToObtainOffset,image); + { + ThrowMATReaderException(BlobError,UnableToObtainOffset,image); + } while(!EOFBlob(image)) /* object parser loop */ { Frames = 1; @@ -788,7 +832,18 @@ MATLAB_KO: ThrowMATReaderException(Corru if(EOFBlob(image)) break; MATLAB_HDR.ObjectSize = ReadBlobXXXLong(image); if(EOFBlob(image)) break; - filepos += MATLAB_HDR.ObjectSize + 4 + 4; + + if(BlobIsSeekable(image)) + { + if(MATLAB_HDR.ObjectSize+filepos > GetBlobSize(image)) /* Safety check for forged and or corrupted data. */ + { + if(logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + " MAT Object with size %u overflows file with size %u.", (unsigned)MATLAB_HDR.ObjectSize, (unsigned)(GetBlobSize(image))); + goto MATLAB_KO; + } + } + + filepos += MATLAB_HDR.ObjectSize + 4 + 4; /* Position of a next object, when exists. */ image2 = image; #if defined(HasZLIB) @@ -796,13 +851,13 @@ MATLAB_KO: ThrowMATReaderException(Corru { if(clone_info==NULL) if((clone_info=CloneImageInfo(image_info)) == NULL) - { - if(logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + { + if(logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), "CloneImageInfo failed"); - continue; - } - image2 = DecompressBlock(image,MATLAB_HDR.ObjectSize,clone_info,exception); - if(image2==NULL) + continue; + } + image2 = DecompressBlock(image,&MATLAB_HDR.ObjectSize,clone_info,exception); + if(image2==NULL) { if(logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), "Decompression failed"); @@ -810,67 +865,66 @@ MATLAB_KO: ThrowMATReaderException(Corru } MATLAB_HDR.DataType = ReadBlobXXXLong(image2); /* replace compressed object type. */ } -#endif +#endif if(MATLAB_HDR.DataType!=miMATRIX) continue; /* skip another objects. */ - + MATLAB_HDR.unknown1 = ReadBlobXXXLong(image2); - MATLAB_HDR.unknown2 = ReadBlobXXXLong(image2); + MATLAB_HDR.unknown2 = ReadBlobXXXLong(image2); MATLAB_HDR.unknown5 = ReadBlobXXXLong(image2); MATLAB_HDR.StructureClass = MATLAB_HDR.unknown5 & 0xFF; - MATLAB_HDR.StructureFlag = (MATLAB_HDR.unknown5>>8) & 0xFF; + MATLAB_HDR.StructureFlag = (MATLAB_HDR.unknown5>>8) & 0xFF; MATLAB_HDR.unknown3 = ReadBlobXXXLong(image2); if(image!=image2) - MATLAB_HDR.unknown4 = ReadBlobXXXLong(image2); /* ??? don't understand why ?? */ + MATLAB_HDR.unknown4 = ReadBlobXXXLong(image2); /* ??? don't understand why ?? */ MATLAB_HDR.unknown4 = ReadBlobXXXLong(image2); MATLAB_HDR.DimFlag = ReadBlobXXXLong(image2); MATLAB_HDR.SizeX = ReadBlobXXXLong(image2); - MATLAB_HDR.SizeY = ReadBlobXXXLong(image2); - + MATLAB_HDR.SizeY = ReadBlobXXXLong(image2); + switch(MATLAB_HDR.DimFlag) - { - case 8: z2=z=1; break; /* 2D matrix*/ - case 12: z2=z = ReadBlobXXXLong(image2); /* 3D matrix RGB*/ - (void) ReadBlobXXXLong(image2); /* Unknown6 */ - if(z!=3) ThrowMATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, + { + case 8: z2=z=1; break; /* 2D matrix*/ + case 12: z2=z = ReadBlobXXXLong(image2); /* 3D matrix RGB*/ + (void) ReadBlobXXXLong(image2); /* Unknown6 */ + if(z!=3) ThrowImg2MATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, image); - break; - case 16: z2=z = ReadBlobXXXLong(image2); /* 4D matrix animation */ - if(z!=3 && z!=1) - ThrowMATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, image); + break; + case 16: z2=z = ReadBlobXXXLong(image2); /* 4D matrix animation */ + if(z!=3 && z!=1) + ThrowImg2MATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, image); Frames = ReadBlobXXXLong(image2); if (Frames == 0) - ThrowMATReaderException(CorruptImageError,ImproperImageHeader,image2); - break; - default: ThrowMATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, - image); - } + ThrowImg2MATReaderException(CorruptImageError,ImproperImageHeader,image2); + break; + default: ThrowImg2MATReaderException(CoderError, MultidimensionalMatricesAreNotSupported, image); + } MATLAB_HDR.Flag1 = ReadBlobXXXShort(image2); MATLAB_HDR.NameFlag = ReadBlobXXXShort(image2); if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), "MATLAB_HDR.StructureClass %d",MATLAB_HDR.StructureClass); - if (MATLAB_HDR.StructureClass != mxCHAR_CLASS && - MATLAB_HDR.StructureClass != mxSINGLE_CLASS && /* float + complex float */ - MATLAB_HDR.StructureClass != mxDOUBLE_CLASS && /* double + complex double */ + if (MATLAB_HDR.StructureClass != mxCHAR_CLASS && + MATLAB_HDR.StructureClass != mxSINGLE_CLASS && /* float + complex float */ + MATLAB_HDR.StructureClass != mxDOUBLE_CLASS && /* double + complex double */ MATLAB_HDR.StructureClass != mxINT8_CLASS && - MATLAB_HDR.StructureClass != mxUINT8_CLASS && /* uint8 + uint8 3D */ + MATLAB_HDR.StructureClass != mxUINT8_CLASS && /* uint8 + uint8 3D */ MATLAB_HDR.StructureClass != mxINT16_CLASS && - MATLAB_HDR.StructureClass != mxUINT16_CLASS && /* uint16 + uint16 3D */ + MATLAB_HDR.StructureClass != mxUINT16_CLASS && /* uint16 + uint16 3D */ MATLAB_HDR.StructureClass != mxINT32_CLASS && - MATLAB_HDR.StructureClass != mxUINT32_CLASS && /* uint32 + uint32 3D */ + MATLAB_HDR.StructureClass != mxUINT32_CLASS && /* uint32 + uint32 3D */ MATLAB_HDR.StructureClass != mxINT64_CLASS && - MATLAB_HDR.StructureClass != mxUINT64_CLASS) /* uint64 + uint64 3D */ - ThrowMATReaderException(CoderError,UnsupportedCellTypeInTheMatrix,image); + MATLAB_HDR.StructureClass != mxUINT64_CLASS) /* uint64 + uint64 3D */ + ThrowImg2MATReaderException(CoderError,UnsupportedCellTypeInTheMatrix,image); switch (MATLAB_HDR.NameFlag) { case 0: - size = ReadBlobXXXLong(image2); /* Object name string size */ + size = ReadBlobXXXLong(image2); /* Object name string size */ size = 4 * (long) ((size + 3 + 1) / 4); (void) SeekBlob(image2, size, SEEK_CUR); break; @@ -887,12 +941,12 @@ MATLAB_KO: ThrowMATReaderException(Corru CellType = ReadBlobXXXLong(image2); /* Additional object type */ if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), "MATLAB_HDR.CellType: %d",CellType); - + (void) ReadBlob(image2, 4, &size); /* data size */ NEXT_FRAME: /* Image is gray when no complex flag is set and 2D Matrix */ - image->is_grayscale = (MATLAB_HDR.DimFlag==8) && + image->is_grayscale = (MATLAB_HDR.DimFlag==8) && ((MATLAB_HDR.StructureFlag & FLAG_COMPLEX) == 0); switch (CellType) @@ -900,70 +954,75 @@ NEXT_FRAME: case miINT8: case miUINT8: sample_size = 8; - if(MATLAB_HDR.StructureFlag & FLAG_LOGICAL) + if(MATLAB_HDR.StructureFlag & FLAG_LOGICAL) image->depth = 1; else image->depth = Min(QuantumDepth,8); /* Byte type cell */ import_options.sample_type = UnsignedQuantumSampleType; - ldblk = (long) MATLAB_HDR.SizeX; + ldblk = (long) MATLAB_HDR.SizeX; break; case miINT16: case miUINT16: sample_size = 16; image->depth = Min(QuantumDepth,16); /* Word type cell */ ldblk = (long) (2 * MATLAB_HDR.SizeX); - import_options.sample_type = UnsignedQuantumSampleType; + import_options.sample_type = UnsignedQuantumSampleType; break; case miINT32: case miUINT32: sample_size = 32; image->depth = Min(QuantumDepth,32); /* Dword type cell */ - ldblk = (long) (4 * MATLAB_HDR.SizeX); - import_options.sample_type = UnsignedQuantumSampleType; + ldblk = (long) (4 * MATLAB_HDR.SizeX); + import_options.sample_type = UnsignedQuantumSampleType; break; case miINT64: case miUINT64: sample_size = 64; image->depth = Min(QuantumDepth,32); /* Qword type cell */ - ldblk = (long) (8 * MATLAB_HDR.SizeX); - import_options.sample_type = UnsignedQuantumSampleType; - break; + ldblk = (long) (8 * MATLAB_HDR.SizeX); + import_options.sample_type = UnsignedQuantumSampleType; + break; case miSINGLE: sample_size = 32; image->depth = Min(QuantumDepth,32); /* double type cell */ import_options.sample_type = FloatQuantumSampleType; #if 0 if (sizeof(float) != 4) - ThrowMATReaderException(CoderError, IncompatibleSizeOfFloat, image); + ThrowImg2MATReaderException(CoderError, IncompatibleSizeOfFloat, image); #endif if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX) - { /* complex float type cell */ - } + { /* complex float type cell */ + } ldblk = (long) (4 * MATLAB_HDR.SizeX); break; case miDOUBLE: - sample_size = 64; + sample_size = 64; image->depth = Min(QuantumDepth,32); /* double type cell */ import_options.sample_type = FloatQuantumSampleType; if (sizeof(double) != 8) - ThrowMATReaderException(CoderError, IncompatibleSizeOfDouble, image); + { + ThrowImg2MATReaderException(CoderError, IncompatibleSizeOfDouble, image); /* this causes immediate return. */ + } if (MATLAB_HDR.StructureFlag & FLAG_COMPLEX) - { /* complex double type cell */ - } + { /* complex double type cell */ + } ldblk = (long) (8 * MATLAB_HDR.SizeX); break; default: - ThrowMATReaderException(CoderError, UnsupportedCellTypeInTheMatrix, image) + ThrowImg2MATReaderException(CoderError, UnsupportedCellTypeInTheMatrix, image) } image->columns = MATLAB_HDR.SizeX; - image->rows = MATLAB_HDR.SizeY; + image->rows = MATLAB_HDR.SizeY; image->colors = 1l << image->depth; if(image->columns == 0 || image->rows == 0) goto MATLAB_KO; + if((unsigned long)ldblk*MATLAB_HDR.SizeY > MATLAB_HDR.ObjectSize) /* Safety check for forged and or corrupted data. */ + goto MATLAB_KO; + if(CheckImagePixelLimits(image, exception) != MagickPass) { - ThrowReaderException(ResourceLimitError,ImagePixelLimitExceeded,image); + ThrowImg2MATReaderException(ResourceLimitError,ImagePixelLimitExceeded,image); } /* ----- Create gray palette ----- */ @@ -972,10 +1031,12 @@ NEXT_FRAME: { if(image->colors>256) image->colors = 256; - if (!AllocateImageColormap(image, image->colors)) + if(AllocateImageColormap(image, image->colors) != MagickPass) { -NoMemory: ThrowMATReaderException(ResourceLimitError, MemoryAllocationFailed, - image)} + if(logging) + (void)LogMagickEvent(CoderEvent,GetMagickModule(), "Cannot allocate colormap with %d colors.", image->colors); +NoMemory: ThrowImg2MATReaderException(ResourceLimitError, MemoryAllocationFailed, image) + } } /* @@ -987,11 +1048,11 @@ NoMemory: ThrowMATReaderException(Resour unsigned long temp = image->columns; /* The true image is rotater 90 degs. Do rotation without data. */ image->columns = image->rows; image->rows = temp; - goto done_reading; /* !!!!!! BAD !!!! */ - } + goto skip_reading_current; + } /* ----- Load raster data ----- */ - BImgBuff = MagickAllocateMemory(unsigned char *,(size_t) (MagickArraySize(ldblk,sizeof(double)))); /* Ldblk was set in the check phase */ + BImgBuff = MagickAllocateArray(unsigned char *,(size_t) (ldblk),sizeof(double)); /* Ldblk was set in the check phase */ if (BImgBuff == NULL) goto NoMemory; (void) memset(BImgBuff,0,ldblk*sizeof(double)); @@ -1000,64 +1061,64 @@ NoMemory: ThrowMATReaderException(Resour { (void) MagickFindRawImageMinMax(image2, import_options.endian,MATLAB_HDR.SizeX, MATLAB_HDR.SizeY,DoublePixel, ldblk, BImgBuff, - &import_options.double_minvalue, + &import_options.double_minvalue, &import_options.double_maxvalue); } if (CellType==miSINGLE) /* Find Min and Max Values for floats */ { (void) MagickFindRawImageMinMax(image2, import_options.endian,MATLAB_HDR.SizeX, - MATLAB_HDR.SizeY,FloatPixel, ldblk, BImgBuff, - &import_options.double_minvalue, + MATLAB_HDR.SizeY,FloatPixel, ldblk, BImgBuff, + &import_options.double_minvalue, &import_options.double_maxvalue); } /* Main loop for reading all scanlines */ if(z==1) z=0; /* read grey scanlines */ - /* else read color scanlines */ + /* else read color scanlines */ do { for(i = 0; i < (long) MATLAB_HDR.SizeY; i++) { q = SetImagePixels(image,0,MATLAB_HDR.SizeY-i-1,image->columns,1); if (q == (PixelPacket *)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 skip_reading_current; /* Skip image rotation, when cannot set image pixels */ + } if(ReadBlob(image2,ldblk,(char *)BImgBuff) != (size_t) ldblk) - { - if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + { + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), " MAT cannot read scanrow %u from a file.", (unsigned)(MATLAB_HDR.SizeY-i-1)); - goto ExitLoop; - } + goto ExitLoop; + } if((CellType==miINT8 || CellType==miUINT8) && (MATLAB_HDR.StructureFlag & FLAG_LOGICAL)) { FixLogical((unsigned char *)BImgBuff,ldblk); if(ImportImagePixelArea(image,z2qtype[z],1,BImgBuff,&import_options,0) == MagickFail) - { + { ImportImagePixelAreaFailed: - if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), " MAT failed to ImportImagePixelArea for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1)); - break; - } + break; + } } else { if(ImportImagePixelArea(image,z2qtype[z],sample_size,BImgBuff,&import_options,0) == MagickFail) - goto ImportImagePixelAreaFailed; + goto ImportImagePixelAreaFailed; - if (z<=1 && /* fix only during a last pass z==0 || z==1 */ - (CellType==miINT8 || CellType==miINT16 || CellType==miINT32 || CellType==miINT64)) - FixSignedValues(q,MATLAB_HDR.SizeX); + if (z<=1 && /* fix only during a last pass z==0 || z==1 */ + (CellType==miINT8 || CellType==miINT16 || CellType==miINT32 || CellType==miINT64)) + FixSignedValues(q,MATLAB_HDR.SizeX); } if (!SyncImagePixels(image)) - { - if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), + { + if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(), " MAT failed to sync image pixels for a row %u", (unsigned)(MATLAB_HDR.SizeY-i-1)); - goto ExitLoop; - } + goto ExitLoop; + } } } while(z-- >= 2); ExitLoop: @@ -1085,28 +1146,28 @@ ExitLoop: if (CellType==miDOUBLE) for (i = 0; i < (long) MATLAB_HDR.SizeY; i++) - { + { ReadBlobXXXDoubles(image2, ldblk, (double *)BImgBuff); InsertComplexDoubleRow((double *)BImgBuff, i, image, MinVal_c, MaxVal_c); - } + } if (CellType==miSINGLE) for (i = 0; i < (long) MATLAB_HDR.SizeY; i++) - { + { ReadBlobXXXFloats(image2, ldblk, (float *)BImgBuff); InsertComplexFloatRow((float *)BImgBuff, i, image, MinVal_c, MaxVal_c); - } + } } /* Image is gray when no complex flag is set and 2D Matrix AGAIN!!! */ - image->is_grayscale = (MATLAB_HDR.DimFlag==8) && + image->is_grayscale = (MATLAB_HDR.DimFlag==8) && ((MATLAB_HDR.StructureFlag & FLAG_COMPLEX) == 0); image->is_monochrome = image->depth==1; if(image->is_monochrome) image->colorspace=GRAYColorspace; - if(image2==image) /* image2 is either native image or decompressed block. */ - image2 = NULL; /* Remove shadow copy to an image before rotation. */ + if(image2==image) /* image2 is either native image or decompressed block. */ + image2 = NULL; /* Remove shadow copy to an image before rotation. */ /* Rotate image. */ rotated_image = RotateImage(image, 90.0, exception); @@ -1119,18 +1180,18 @@ ExitLoop: blob = rotated_image->blob; rotated_image->blob = image->blob; rotated_image->colors = image->colors; - image->blob = blob; + image->blob = blob; AppendImageToList(&image,rotated_image); - DeleteImageFromList(&image); + DeleteImageFromList(&image); } -done_reading: +skip_reading_current: if(image2==image) image2 = NULL; - /* Allocate next image structure. */ + /* Allocate next image structure. */ AllocateNextImage(image_info,image); - if (image->next == (Image *) NULL) break; + if (image->next == (Image *) NULL) break; image=SyncNextImageInList(image); image->columns = image->rows = 0; image->colors=0; @@ -1147,19 +1208,19 @@ done_reading: } if(image2!=NULL) - if(image2!=image) /* Does shadow temporary decompressed image exist? */ + if(image2!=image) /* Does shadow temporary decompressed image exist? */ { -/* CloseBlob(image2); */ +/* CloseBlob(image2); */ DeleteImageFromList(&image2); - if(clone_info) - { + if(clone_info) + { if(clone_info->file) - { + { fclose(clone_info->file); clone_info->file = NULL; (void) unlink(clone_info->filename); - } - } + } + } } } @@ -1169,9 +1230,9 @@ END_OF_READING: CloseBlob(image); { - Image *p; + Image *p; long scene=0; - + /* Rewind list, removing any empty images while rewinding. */ @@ -1188,7 +1249,7 @@ END_OF_READING: p=p->previous; } } - + /* Fix scene numbers */ @@ -1196,7 +1257,7 @@ END_OF_READING: p->scene=scene++; } - if(clone_info != NULL) /* cleanup garbage file from compression */ + if(clone_info != NULL) /* cleanup garbage file from compression */ { if(clone_info->file) { @@ -1224,7 +1285,7 @@ END_OF_READING: % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% Function WriteMATLABImage writes an Matlab matrix to a file. +% Function WriteMATLABImage writes an Matlab matrix to a file. % % The format of the WriteMATLABImage method is: % @@ -1255,7 +1316,7 @@ static unsigned int WriteMATLABImage(con unsigned char *pixels; int is_gray; unsigned char ImageName = 'A'; - + current_time = time((time_t *)NULL); t = localtime(¤t_time); @@ -1269,7 +1330,7 @@ static unsigned int WriteMATLABImage(con logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter MAT"); status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); if (status == False) - ThrowWriterException(FileOpenError,UnableToOpenFile,image); + ThrowWriterException(FileOpenError,UnableToOpenFile,image); /* Store MAT header. @@ -1285,7 +1346,7 @@ static unsigned int WriteMATLABImage(con MATLAB_HDR[0x7C]=0; MATLAB_HDR[0x7D]=1; MATLAB_HDR[0x7E]='I'; - MATLAB_HDR[0x7F]='M'; + MATLAB_HDR[0x7F]='M'; (void) WriteBlob(image,sizeof(MATLAB_HDR),MATLAB_HDR); pixels=(unsigned char *) NULL; @@ -1293,7 +1354,7 @@ static unsigned int WriteMATLABImage(con { pixels=MagickAllocateMemory(unsigned char *,image->rows); if (pixels == (unsigned char *) NULL) - ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image); + ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image); is_gray = IsGrayImage(image,&image->exception); z = is_gray ? 0 : 3; @@ -1306,21 +1367,21 @@ static unsigned int WriteMATLABImage(con (void) WriteBlobLSBLong(image, DataSize + padding + (is_gray?48l:56l)); /* 0x84 */ (void) WriteBlobLSBLong(image, 0x6); /* 0x88 */ (void) WriteBlobLSBLong(image, 0x8); /* 0x8C */ - (void) WriteBlobLSBLong(image, 0x6); /* 0x90 */ - (void) WriteBlobLSBLong(image, 0); + (void) WriteBlobLSBLong(image, 0x6); /* 0x90 */ + (void) WriteBlobLSBLong(image, 0); (void) WriteBlobLSBLong(image, 0x5); /* 0x98 */ (void) WriteBlobLSBLong(image, is_gray?0x8:0xC); /* 0x9C - DimFlag */ - (void) WriteBlobLSBLong(image, image->rows); /* x: 0xA0 */ - (void) WriteBlobLSBLong(image, image->columns); /* y: 0xA4 */ + (void) WriteBlobLSBLong(image, image->rows); /* x: 0xA0 */ + (void) WriteBlobLSBLong(image, image->columns); /* y: 0xA4 */ if(!is_gray) { - (void) WriteBlobLSBLong(image, 3); /* z: 0xA8 */ + (void) WriteBlobLSBLong(image, 3); /* z: 0xA8 */ (void) WriteBlobLSBLong(image, 0); } - (void) WriteBlobLSBShort(image, 1); /* 0xB0 */ + (void) WriteBlobLSBShort(image, 1); /* 0xB0 */ (void) WriteBlobLSBShort(image, 1); /* 0xB2 */ (void) WriteBlobLSBLong(image, ImageName++); /* 0xB4 - here is a small bug only 'A' .. 'Z images could be generated properly */ - (void) WriteBlobLSBLong(image, 0x2); /* 0xB8 */ + (void) WriteBlobLSBLong(image, 0x2); /* 0xB8 */ (void) WriteBlobLSBLong(image, DataSize); /* 0xBC */ /* @@ -1340,7 +1401,7 @@ static unsigned int WriteMATLABImage(con do { for (y=0; y<(long)image->columns; y++) - { + { progress_quantum++; (void) AcquireImagePixels(image,y,0,1,image->rows,&image->exception); (void) ExportImagePixelArea(image,z2qtype[z],8,pixels,0,0); @@ -1348,9 +1409,9 @@ static unsigned int WriteMATLABImage(con if (QuantumTick(progress_quantum,progress_span)) if (!MagickMonitorFormatted(progress_quantum,progress_span,&image->exception, SaveImageText,image->filename, - image->columns,image->rows)) + image->columns,image->rows)) goto BreakAll; - } + } } while(z-- >= 2); } BreakAll: @@ -1359,7 +1420,7 @@ BreakAll: status=True; - if(pixels) + if(pixels) {MagickFreeMemory(pixels);pixels=NULL;} if(image->next==NULL) break; image=SyncNextImageInList(image); @@ -1370,7 +1431,7 @@ BreakAll: if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),"return MAT"); - + return(status); } @@ -1409,7 +1470,7 @@ ModuleExport void RegisterMATImage(void) #if defined(HasZLIB) "MATLAB Level 4.0-7.0 image formats"; #else - "MATLAB Level 4.0-6.0 image formats"; + "MATLAB Level 4.0-6.0 image formats"; #endif entry->module = "MAT"; entry->blob_support=False;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor