GraphicsMagick: coders/bmp.c: Writer for BI_PNG compression.

GraphicsMagick Commits <[email protected]> Wed, 27 Sep 2023 16:56:00 -0500
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.4315.1695851768.1961.graphicsmagick-commit@lists.sourceforge.net>
changeset 3e424bd00b6c in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=3e424bd00b6c
summary: coders/bmp.c: Writer for BI_PNG compression.

diffstat:

 ChangeLog    |   4 ++++
 coders/bmp.c |  35 ++++++++++++++++++++++++++---------
 2 files changed, 30 insertions(+), 9 deletions(-)

diffs (95 lines):

diff -r d97320e45918 -r 3e424bd00b6c ChangeLog
--- a/ChangeLog	Sat Sep 23 16:13:36 2023 -0500
+++ b/ChangeLog	Wed Sep 27 23:55:25 2023 +0200
@@ -1,3 +1,7 @@
+2023-09-27  Fojtik Jaroslav  <[email protected]>
+
+	* coders/bmp.c: Writer for BI_PNG compression.
+
 2023-09-23  Bob Friesenhahn  <[email protected]>
 
 	* version.sh : Updates for the 1.3.42 release.
diff -r d97320e45918 -r 3e424bd00b6c coders/bmp.c
--- a/coders/bmp.c	Sat Sep 23 16:13:36 2023 -0500
+++ b/coders/bmp.c	Wed Sep 27 23:55:25 2023 +0200
@@ -1935,7 +1935,18 @@
 }
 
 
-static int StoreBlobJPG(Image * image, const ImageInfo * image_info)
+typedef struct
+{
+    const char *FormatName;
+    const char *FormatNameDDot;
+    const char *Desc;
+} TForeignFormatDesc;
+
+const TForeignFormatDesc StoreDescJPG = {"JPEG", "JPEG:", "  Creating jpeg_image."};
+const TForeignFormatDesc StoreDescPNG = {"PNG", "PNG:", "  Creating png_image."};
+
+
+static int StoreAlienBlob(Image * image, const ImageInfo * image_info, const TForeignFormatDesc *pFormatDesc)
 {
 ImageInfo *jpeg_image_info;
 Image *jpeg_image;
@@ -1946,15 +1957,14 @@
   if(jpeg_image_info == (ImageInfo *) NULL)
       ThrowWriterException(ResourceLimitError,MemoryAllocationFailed, image);
   if(image->logging)
-      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                              "  Creating jpeg_image.");
+      (void) LogMagickEvent(CoderEvent,GetMagickModule(), pFormatDesc->Desc);
 
   jpeg_image = CloneImage(image,0,0,MagickTrue,&image->exception);
 
-  (void)strlcpy(jpeg_image_info->magick,"JPEG",MaxTextExtent);
+  (void)strlcpy(jpeg_image_info->magick, pFormatDesc->FormatName, MaxTextExtent);
   (void)strlcpy(jpeg_image_info->filename,"JPEG:",MaxTextExtent);
-  (void)strlcpy(jpeg_image->magick,"JPEG",MaxTextExtent);
-  (void)strlcpy(jpeg_image->filename,"JPEG:",MaxTextExtent);
+  (void)strlcpy(jpeg_image->magick, pFormatDesc->FormatName, MaxTextExtent);
+  (void)strlcpy(jpeg_image->filename, pFormatDesc->FormatNameDDot, MaxTextExtent);
 
   Data = ImageToBlob(jpeg_image_info,jpeg_image,&DataSize,&image->exception);
   if(Data!=NULL)
@@ -2110,6 +2120,13 @@
           bmp_info.bits_per_pixel = 0;
           bmp_info.compression = BI_JPEG;
         }
+      else if(type>2 && AccessDefinition(image_info,"bmp","allow-png"))
+        {
+          image->compression = ZipCompression;
+          bmp_info.number_colors = 0;
+          bmp_info.bits_per_pixel = 0;
+          bmp_info.compression = BI_PNG;
+        }
       else if (image->storage_class == DirectClass)
         {
           /*
@@ -2159,7 +2176,7 @@
         Below emulates:
         bytes_per_line=4*((image->columns*bmp_info.bits_per_pixel+31)/32);
       */
-      if(bmp_info.compression == BI_JPEG)
+      if(bmp_info.compression==BI_JPEG || bmp_info.compression==BI_PNG)
       {
         bytes_per_line = 0;
         image_size = 0;
@@ -2242,7 +2259,7 @@
       /*
         Convert MIFF to BMP raster pixels.
       */
-      if(bmp_info.compression == BI_JPEG)
+      if(bmp_info.compression==BI_JPEG || bmp_info.compression==BI_PNG)
         pixels=NULL;
       else
       {
@@ -2578,7 +2595,7 @@
         }
         if(pixels==NULL)
         {
-          StoreBlobJPG(image,image_info);
+          StoreAlienBlob(image,image_info, (bmp_info.compression==BI_JPEG)? &StoreDescJPG : &StoreDescPNG);
         }
         else
         {