GraphicsMagick: coders/topol.c: Deallocate 'pixels' correctly, f...
GraphicsMagick Commits <[email protected]>
| Newsgroups | gmane.comp.video.graphicsmagick.cvs |
|---|---|
| Message-ID | <mailman.11340.1682832303.1789.graphicsmagick-commit@lists.sourceforge.net> |
changeset 4ff8b6fea286 in /hg/GraphicsMagick details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=4ff8b6fea286 summary: coders/topol.c: Deallocate 'pixels' correctly, fix MEZ reindexing. diffstat: ChangeLog | 4 ++ coders/topol.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 82 insertions(+), 17 deletions(-) diffs (165 lines): diff -r 0573a8abe875 -r 4ff8b6fea286 ChangeLog --- a/ChangeLog Sat Apr 29 12:00:29 2023 -0500 +++ b/ChangeLog Sun Apr 30 07:24:25 2023 +0200 @@ -1,3 +1,7 @@ +2023-04-30 Fojtik Jaroslav <[email protected]> + + * coders/topol.c: Deallocate 'pixels' correctly, fix MEZ reindexing. + 2023-04-29 Bob Friesenhahn <[email protected]> * www/download.rst: More properly describe how to use 'gpg diff -r 0573a8abe875 -r 4ff8b6fea286 coders/topol.c --- a/coders/topol.c Sat Apr 29 12:00:29 2023 -0500 +++ b/coders/topol.c Sun Apr 30 07:24:25 2023 +0200 @@ -477,7 +477,7 @@ if(j<=0 || j>256) j=256; for(i=0; i<j; i++) { - MEZ[i] = (unsigned char)((i*256)/j); + MEZ[i] = (unsigned char)((i*255) / (j-1)); } if(Header.FileType>=5) goto NoMEZ; @@ -585,8 +585,11 @@ { ldblk=ReadBlobByte(palette); /*size of palette*/ if(ldblk==EOF) goto ErasePalette; - image->colors=ldblk+1; - if (!AllocateImageColormap(image, image->colors)) goto NoMemory; + if(ldblk==0) + image->colors = 256; + else + image->colors = ldblk+1; + if(!AllocateImageColormap(image, image->colors)) goto NoMemory; for(i=0;i<=ldblk;i++) { @@ -782,6 +785,7 @@ size_t DataSize; QuantumType qt; int bpp; + ImageInfo *clone_info; /* Open output image file. */ assert(image_info != (const ImageInfo *) NULL); @@ -794,9 +798,9 @@ memset(&Header,0,sizeof(Header)); memset(&Header.Name,' ',sizeof(Header.Name)); //Header.Version = 0; - Header.Cols = image->columns; + Header.Cols = image->columns; Header.Rows = image->rows; - if(image->colors>=1 && image->colors<=255) + if(image->colors>=1 && image->colors<=256) { if(image->colors <= 2) { @@ -836,21 +840,21 @@ ThrowWriterException(FileOpenError,UnableToOpenFile,image); /* Write TopoL hader. */ - WriteBlob(image, 20, Header.Name); + WriteBlob(image, 20, Header.Name); WriteBlobLSBShort(image, Header.Rows); WriteBlobLSBShort(image, Header.Cols); WriteBlobLSBShort(image, Header.FileType); WriteBlobLSBLong(image, Header.Zoom); WriteBlobLSBShort(image, Header.Version); WriteBlobLSBShort(image, Header.Komprese); - WriteBlobLSBShort(image, Header.Stav); - - WriteBlobLSBDouble(image, Header.xRasMin); - WriteBlobLSBDouble(image, Header.yRasMin); - WriteBlobLSBDouble(image, Header.xRasMax); - WriteBlobLSBDouble(image, Header.yRasMax); - WriteBlobLSBDouble(image, Header.Scale); - //from release 2 + WriteBlobLSBShort(image, Header.Stav); + + WriteBlobLSBDouble(image, Header.xRasMin); + WriteBlobLSBDouble(image, Header.yRasMin); + WriteBlobLSBDouble(image, Header.xRasMax); + WriteBlobLSBDouble(image, Header.yRasMax); + WriteBlobLSBDouble(image, Header.Scale); + //from release 2 WriteBlobLSBShort(image, Header.TileWidth); WriteBlobLSBShort(image, Header.TileHeight); WriteBlobLSBLong(image, Header.TileOffsets); @@ -859,9 +863,6 @@ WriteBlob(image, 423, Header.Dummy); - /* Palette */ - - /* Store image data. */ for(y=0; y<(long)image->rows; y++) { @@ -883,6 +884,66 @@ } CloseBlob(image); + MagickFreeResourceLimitedMemory(pixels); + + /* Palette */ + if(qt == IndexQuantum) + { + if((clone_info=CloneImageInfo(image_info)) != NULL) + { + size_t i,j; + Image *Palette; + ExceptionInfo exception; + + i = strlen(clone_info->filename); + j = i; + while(--i > 0) + { + if(clone_info->filename[i]=='.') + { + break; + } + if(clone_info->filename[i]=='/' || clone_info->filename[i]=='\\' || clone_info->filename[i]==':' ) + { + i=j; + break; + } + } + (void) strlcpy(clone_info->filename+i,".pal",sizeof(clone_info->filename)-i); + if((clone_info->file=fopen(clone_info->filename,"wb"))!=NULL) + { + if((Palette=AllocateImage(clone_info))!=NULL ) + { + if(OpenBlob(clone_info,Palette,WriteBinaryBlobMode,&exception)) + { + if(Header.FileType == 2) + j = 256; + else + j = 15; + WriteBlobByte(Palette,j); + for(i=0; i<j; i++) + { + WriteBlobByte(Palette, i&0xFF); + if(i<image->colors) + { + WriteBlobByte(Palette,i); + WriteBlobByte(Palette,i); + WriteBlobByte(Palette,i); + } + else + { + WriteBlobByte(Palette,ScaleQuantumToChar(image->colormap[i].red)); + WriteBlobByte(Palette,ScaleQuantumToChar(image->colormap[i].green)); + WriteBlobByte(Palette,ScaleQuantumToChar(image->colormap[i].blue)); + } + } + } + } + } + DestroyImageInfo(clone_info); + } + } + if(logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),"return TopoL");