GraphicsMagick: coders/bmp.c: Fix BMP 64bpp reader. See this URL...

GraphicsMagick Commits <[email protected]> Sat, 30 Sep 2023 18:27:44 -0500
Newsgroups gmane.comp.video.graphicsmagick.cvs
Message-ID <mailman.5141.1696116477.1961.graphicsmagick-commit@lists.sourceforge.net>
changeset 2cebe8a082c5 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=2cebe8a082c5
summary: coders/bmp.c: Fix BMP 64bpp reader. See this URL: https://stackoverflow.com/questions/20778227/get-64bpp-image-color

diffstat:

 ChangeLog    |   5 +++++
 coders/bmp.c |  34 +++++++++++++++++++++++++++-------
 2 files changed, 32 insertions(+), 7 deletions(-)

diffs (73 lines):

diff -r 123df8ed6be8 -r 2cebe8a082c5 ChangeLog
--- a/ChangeLog	Sat Sep 30 10:48:01 2023 +0200
+++ b/ChangeLog	Sun Oct 01 01:26:24 2023 +0200
@@ -1,3 +1,8 @@
+2023-10-01  Fojtik Jaroslav  <[email protected]>
+
+	* coders/bmp.c: Fix BMP 64bpp reader. See this URL:
+	https://stackoverflow.com/questions/20778227/get-64bpp-image-color
+
 2023-09-30  Fojtik Jaroslav  <[email protected]>
 
 	* coders/bmp.c: Attempt to read BMP with 64bpp.
diff -r 123df8ed6be8 -r 2cebe8a082c5 coders/bmp.c
--- a/coders/bmp.c	Sat Sep 30 10:48:01 2023 +0200
+++ b/coders/bmp.c	Sun Oct 01 01:26:24 2023 +0200
@@ -90,6 +90,24 @@
 #undef LCS_GM_ABS_COLORIMETRIC
 #define LCS_GM_ABS_COLORIMETRIC  8  /* Absolute */
 #endif /* !defined(MSWINDOWS) || defined(__MINGW32__) */
+
+#if (QuantumDepth == 8)
+  #define MS_VAL16_TO_QUANTUM(_value)	((_value>=8192)?255:(_value>>5))
+#elif (QuantumDepth == 16)
+  #define MS_VAL16_TO_QUANTUM(_value)	((_value>=8192)?65535:(_value*8))
+#elif (QuantumDepth == 32)
+  #define MS_VAL16_TO_QUANTUM(_value)	((_value>=8192)?4294443007:(_value*524288))
+#else
+# error Unsupported quantum depth.
+#endif
+
+
+#ifdef WORDS_BIGENDIAN
+  #define LD_UINT16_LSB(_pixel, _ptr) _pixel=(magick_uint16_t)*_ptr++; _pixel|=(magick_uint16_t)*_ptr++ << 8
+#else
+  #define LD_UINT16_LSB(_pixel, _ptr) _pixel=*(magick_uint16_t*)_ptr; _ptr+=2
+#endif
+
 
 /*
   Typedef declarations.
@@ -1751,23 +1769,25 @@
           }
         case 64:
           {
-            register magick_uint16_t *p16;
+            magick_uint16_t val_16;
             /*
               Convert DirectColor scanline.
             */
-            bytes_per_line = 4*((image->columns*64+31)/32);
             for(y=(long) image->rows-1; y >= 0; y--)
               {
-                p16 = pixels+(image->rows-y-1)*bytes_per_line;
+                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++)
                   {
-                    q->blue=ScaleShortToQuantum(*p16++);
-                    q->green=ScaleShortToQuantum(*p16++);
-                    q->red=ScaleShortToQuantum(*p16++);
-                    p16++;	/* TODO: add alpha*/
+                    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);
+                    p+=2;		/* TODO: add alpha*/
                     q++;
                   }
                 if(!SyncImagePixels(image))