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");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.