GraphicsMagick: coders/bmp.c: Attempt to read BMP with 48bpp.

GraphicsMagick Commits <[email protected]> Sun, 01 Oct 2023 23:51:40 -0500
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.5329.1696222318.1961.graphicsmagick-commit@lists.sourceforge.net>
changeset acad39861af2 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=acad39861af2
summary: coders/bmp.c: Attempt to read BMP with 48bpp.

diffstat:

 ChangeLog    |   4 ++++
 coders/bmp.c |  44 ++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diffs (79 lines):

diff -r 2cebe8a082c5 -r acad39861af2 ChangeLog
--- a/ChangeLog	Sun Oct 01 01:26:24 2023 +0200
+++ b/ChangeLog	Mon Oct 02 06:51:16 2023 +0200
@@ -1,3 +1,7 @@
+2023-10-02  Fojtik Jaroslav  <[email protected]>
+
+	* coders/bmp.c: Attempt to read BMP with 48bpp.
+
 2023-10-01  Fojtik Jaroslav  <[email protected]>
 
 	* coders/bmp.c: Fix BMP 64bpp reader. See this URL:
diff -r 2cebe8a082c5 -r acad39861af2 coders/bmp.c
--- a/coders/bmp.c	Sun Oct 01 01:26:24 2023 +0200
+++ b/coders/bmp.c	Mon Oct 02 06:51:16 2023 +0200
@@ -1234,7 +1234,8 @@
                                 image);
       if ((bmp_info.bits_per_pixel != 1) && (bmp_info.bits_per_pixel != 2) && (bmp_info.bits_per_pixel != 4) &&
           (bmp_info.bits_per_pixel != 8) && (bmp_info.bits_per_pixel != 16) &&
-          (bmp_info.bits_per_pixel != 24) && (bmp_info.bits_per_pixel != 32) && (bmp_info.bits_per_pixel != 64))
+          (bmp_info.bits_per_pixel != 24) && (bmp_info.bits_per_pixel != 32) &&
+          (bmp_info.bits_per_pixel != 48) && (bmp_info.bits_per_pixel != 64))
         ThrowBMPReaderException(CorruptImageError,UnrecognizedBitsPerPixel,image);
       if (bmp_info.bits_per_pixel < 16)
         {
@@ -1253,7 +1254,7 @@
 #if (QuantumDepth == 8)
       image->depth=8;
 #else
-      if(bmp_info.bits_per_pixel == 64)
+      if(bmp_info.bits_per_pixel==48 || bmp_info.bits_per_pixel==64)
           image->depth=16;
       else
           image->depth=8;
@@ -1767,6 +1768,45 @@
             /* if(ZeroOpacity) image->matte = False; */
             break;
           }
+
+        case 48:
+          {
+            magick_uint16_t val_16;
+            /*
+              Convert DirectColor scanline.
+            */
+            for(y=(long) image->rows-1; y >= 0; y--)
+              {
+                p = pixels+(image->rows-y-1)*bytes_per_line;
+                q = SetImagePixels(image,0,y,image->columns,1);
+                if(q == (PixelPacket *) NULL)
+                  break;
+                for(x=0; x < (long) image->columns; x++)
+                  {
+                    LD_UINT16_LSB(val_16,p);
+                    q->blue = MS_VAL16_TO_QUANTUM(val_16);
+                    LD_UINT16_LSB(val_16,p);
+                    q->green = MS_VAL16_TO_QUANTUM(val_16);
+                    LD_UINT16_LSB(val_16,p);
+                    q->red = MS_VAL16_TO_QUANTUM(val_16);
+                    q++;
+                  }
+                if(!SyncImagePixels(image))
+                  break;
+                if(image->previous == (Image *) NULL)
+                  if(QuantumTick(y,image->rows))
+                    {
+                      status=MagickMonitorFormatted(image->rows-y-1,image->rows,
+                                                    exception,LoadImageText,
+                                                    image->filename,
+                                                    image->columns,image->rows);
+                      if(status == False)
+                        break;
+                    }
+              }
+            break;
+          }
+
         case 64:
           {
             magick_uint16_t val_16;