freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2-demos] master a61c68f 2/2: [graph/win32] Enable 15/16/32-bit


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master a61c68f 2/2: [graph/win32] Enable 15/16/32-bit modes.
Date: Fri, 23 Oct 2020 00:14:31 -0400 (EDT)

branch: master
commit a61c68f7c52f84674c7acb6f04158114c2d67c40
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    [graph/win32] Enable 15/16/32-bit modes.
    
    The rgb555 mode uses legacy blitting and is somewhat broken.
    
    * src/win32/grwin32.c (gr_win32_surface_refresh_rectangle,
    gr_win32_surface_init): Updated.
---
 ChangeLog             |  9 +++++++++
 graph/win32/grwin32.c | 48 ++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ba15d71..c5f2e19 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2020-10-23  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [graph/win32] Enable 15/16/32-bit modes.
+
+       The rgb555 mode uses legacy blitting and is somewhat broken.
+
+       * src/win32/grwin32.c (gr_win32_surface_refresh_rectangle,
+       gr_win32_surface_init): Updated.
+
 2020-10-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
        [graph] Rearrange 32-bit color.
diff --git a/graph/win32/grwin32.c b/graph/win32/grwin32.c
index cc1597e..8287e5a 100644
--- a/graph/win32/grwin32.c
+++ b/graph/win32/grwin32.c
@@ -196,12 +196,13 @@ gr_win32_surface_refresh_rectangle(
   }
 #endif
 
-  /* copy to BGR buffer */
+  /* copy the buffer */
   {
     unsigned char*  read_line   = (unsigned char*)bitmap->buffer;
     int             read_pitch  = bitmap->pitch;
     unsigned char*  write_line  = (unsigned char*)surface->bgrBitmap.buffer;
     int             write_pitch = surface->bgrBitmap.pitch;
+    int             bytes = 0;
 
     if ( read_pitch < 0 )
       read_line -= ( bitmap->rows - 1 ) * read_pitch;
@@ -212,20 +213,28 @@ gr_win32_surface_refresh_rectangle(
     read_line  += y * read_pitch;
     write_line += y * write_pitch;
 
-    if ( bitmap->mode == gr_pixel_mode_gray )
+    switch ( bitmap->mode )
     {
-      read_line  += x;
-      write_line += x;
+    case gr_pixel_mode_rgb32:
+      bytes += 2;
+      /* fall through */
+    case gr_pixel_mode_rgb555:
+    case gr_pixel_mode_rgb565:
+      bytes += 1;
+      /* fall through */
+    case gr_pixel_mode_gray:
+      bytes += 1;
+      read_line  += x * bytes;
+      write_line += x * bytes;
       for ( ; h > 0; h-- )
       {
-        memcpy( write_line, read_line, w );
+        memcpy( write_line, read_line, w * bytes );
 
         read_line  += read_pitch;
         write_line += write_pitch;
       }
-    }
-    else
-    {
+      break;
+    case gr_pixel_mode_rgb24:
       read_line  += 3 * x;
       write_line += 3 * x;
       for ( ; h > 0; h-- )
@@ -234,6 +243,7 @@ gr_win32_surface_refresh_rectangle(
         unsigned char*  read_limit = read + 3 * w;
         unsigned char*  write      = write_line;
 
+        /* convert RGB to BGR */
         for ( ; read < read_limit; read += 3, write += 3 )
         {
           write[0] = read[2];
@@ -522,6 +532,28 @@ gr_win32_surface_init( grWin32Surface*  surface,
     }
     break;
 
+  case gr_pixel_mode_rgb32:
+    surface->bmiHeader.biBitCount    = 32;
+    surface->bmiHeader.biCompression = BI_RGB;
+    break;
+
+  case gr_pixel_mode_rgb555:
+    surface->bmiHeader.biBitCount    = 16;
+    surface->bmiHeader.biCompression = BI_RGB;
+    break;
+
+  case gr_pixel_mode_rgb565:
+    surface->bmiHeader.biBitCount    = 16;
+    surface->bmiHeader.biCompression = BI_BITFIELDS;
+    {
+       LPDWORD  mask = (LPDWORD)surface->bmiColors;
+
+       mask[0] = 0xF800;
+       mask[1] = 0x07E0;
+       mask[2] = 0x001F;
+    }
+    break;
+
   default:
     return 0;         /* Unknown mode */
   }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]