freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master b68f156: [graph] Untested legacy 15/16-bit colo


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master b68f156: [graph] Untested legacy 15/16-bit color fixes.
Date: Wed, 19 Oct 2016 02:51:36 +0000 (UTC)

branch: master
commit b68f156f15a925ea7f2a89a7fbd8d2eb1085927b
Author: Alexei Podtelezhnikov <address@hidden>
Commit: Alexei Podtelezhnikov <address@hidden>

    [graph] Untested legacy 15/16-bit color fixes.
    
    Our tools do not use the legacy 15/16-bit color modes. This is mostly
    for the sake of correctness. We might also remove the code.
    
    * graph/grblit.c (blit_gray{8,}_to_{555,565}): Updated.
    * graph/x11/grx11.c (gr_x11_format_{bgr565,rgb555,bgr555}): Updated.
---
 ChangeLog         |   10 ++++++++
 graph/grblit.c    |   67 +++++++++++++++++++++--------------------------------
 graph/x11/grx11.c |    6 ++---
 3 files changed, 39 insertions(+), 44 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a7e7d25..aacd1d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2016-10-18  Alexei Podtelezhnikov  <address@hidden>
+
+       [graph] Untested legacy 15/16-bit color fixes.
+
+       Our tools do not use the legacy 15/16-bit color modes. This is mostly
+       for the sake of correctness. We might also remove the code.
+
+       * graph/grblit.c (blit_gray{8,}_to_{555,565}): Updated.
+       * graph/x11/grx11.c (gr_x11_format_{bgr565,rgb555,bgr555}): Updated.
+
 2016-10-13  Alexei Podtelezhnikov  <address@hidden>
 
        * graph/grblit.c (blit_lcd28_to_24): Typo.
diff --git a/graph/grblit.c b/graph/grblit.c
index a69e0cb..8c12004 100644
--- a/graph/grblit.c
+++ b/graph/grblit.c
@@ -865,19 +865,15 @@
                            grColor     color )
   {
     int             y;
-    int             sr = (color.chroma[0] << 8) & 0x7C00;
+    int             sr = (color.chroma[0] << 7) & 0x7C00;
     int             sg = (color.chroma[1] << 2) & 0x03E0;
-    int             sb = (color.chroma[2]     ) & 0x001F;
+    int             sb = (color.chroma[2] >> 3) & 0x001F;
     unsigned char*  read;
     unsigned char*  write;
-    long            color2;
 
     read   = blit->read  + blit->xread;
     write  = blit->write + 2*blit->xwrite;
 
-    color2 = color.value;
-    extract565( color2, color );
-
     y = blit->height;
     do
     {
@@ -895,9 +891,7 @@
           unsigned short* pixel = (unsigned short*)_write;
 
           if (val >= 254 )
-          {
-            pixel[0] = (unsigned short)color2;
-          }
+            *pixel = (unsigned short)( sr | sg | sb );
           else if ( val >= 2 )
           {
             /* compose gray value */
@@ -906,17 +900,14 @@
             int   dg  = pix & 0x03E0;
             int   db  = pix & 0x001F;
 
-            dr  = pix & 0x7C00;
             dr += ((sr-dr)*val) >> 8;
-            dr &= 0xF800;
+            dr &= 0x7C00;
 
-            dg  = pix & 0x03E0;
             dg += ((sg-dg)*val) >> 8;
-            dg &= 0x7E0;
+            dg &= 0x03E0;
 
-            db  = pix & 0x001F;
             db += ((sb-db)*val) >> 8;
-            db += 0x001F;
+            db &= 0x001F;
 
             *pixel = (unsigned short)( dr | dg | db );
           }
@@ -943,14 +934,14 @@
     int             y;
     unsigned char*  read;
     unsigned char*  write;
-    long            color2;
 
     read   = blit->read  + blit->xread;
     write  = blit->write + 2*blit->xwrite;
 
-    /* convert color to R:G:B triplet */
-    color2 = color.value;
-    extract555( color2, color );
+    /* scale down R:G:B triplet */
+    color.chroma[0] >>= 3;
+    color.chroma[1] >>= 3;
+    color.chroma[2] >>= 3;
 
     y = blit->height;
     do
@@ -969,7 +960,7 @@
           unsigned short* pixel = (unsigned short*)_write;
 
           if (val == max)
-            pixel[0] = (unsigned short)color2;
+            *pixel = (unsigned short)(inject555( color ));
           else
           {
             /* compose gray value */
@@ -979,7 +970,7 @@
             extract555( pix16, pix );
 
             compose_pixel( pix, color, val, max );
-            *pixel = (unsigned short)(inject555(pix));
+            *pixel = (unsigned short)(inject555( pix ));
           }
         }
         _write += 2;
@@ -1008,18 +999,14 @@
   {
     int             y;
     int             sr = (color.chroma[0] << 8) & 0xF800;
-    int             sg = (color.chroma[1] << 2) & 0x07E0;
-    int             sb = (color.chroma[2]     ) & 0x001F;
+    int             sg = (color.chroma[1] << 3) & 0x07E0;
+    int             sb = (color.chroma[2] >> 3) & 0x001F;
     unsigned char*  read;
     unsigned char*  write;
-    long            color2;
 
     read   = blit->read  + blit->xread;
     write  = blit->write + 2*blit->xwrite;
 
-    color2 = color.value;
-    extract565( color2, color );
-
     y = blit->height;
     do
     {
@@ -1037,7 +1024,7 @@
           unsigned short* pixel = (unsigned short*)_write;
 
           if (val >= 254 )
-            pixel[0] = (unsigned short)color2;
+            *pixel = (unsigned short)( sr | sg | sb );
           else if ( val >= 2 )
           {
             /* compose gray value */
@@ -1046,17 +1033,14 @@
             int   dg  = pix & 0x07E0;
             int   db  = pix & 0x001F;
 
-            dr  = pix & 0xF800;
             dr += ((sr-dr)*val) >> 8;
             dr &= 0xF800;
 
-            dg  = pix & 0x07E0;
             dg += ((sg-dg)*val) >> 8;
-            dg &= 0x7E0;
+            dg &= 0x07E0;
 
-            db  = pix & 0x001F;
             db += ((sb-db)*val) >> 8;
-            db += 0x001F;
+            db &= 0x001F;
 
             *pixel = (unsigned short)( dr | dg | db );
           }
@@ -1082,13 +1066,14 @@
     int             y;
     unsigned char*  read;
     unsigned char*  write;
-    long            color2;
 
     read   = blit->read  + blit->xread;
     write  = blit->write + 2*blit->xwrite;
 
-    color2 = color.value;
-    extract565( color2, color );
+    /* scale down R:G:B triplet */
+    color.chroma[0] >>= 3;
+    color.chroma[1] >>= 2;
+    color.chroma[2] >>= 3;
 
     y = blit->height;
     do
@@ -1107,7 +1092,7 @@
           unsigned short* pixel = (unsigned short*)_write;
 
           if (val == max)
-            pixel[0] = (unsigned short)color2;
+            *pixel = (unsigned short)inject565( color );
           else
           {
             /* compose gray value */
@@ -1867,7 +1852,7 @@
       static double         gblender_gamma = -100.0;
 
       if ( glyph->grays != 256 )
-        goto DefaultBlit;
+        goto LegacyBlit;
 
       switch ( glyph->mode )
       {
@@ -1879,7 +1864,7 @@
       case gr_pixel_mode_bgra:  src_format = GBLENDER_SOURCE_BGRA;  break;
 
       default:
-          goto DefaultBlit;
+          goto LegacyBlit;
       }
 
       width  = glyph->width;
@@ -1899,7 +1884,7 @@
       case gr_pixel_mode_rgb24: dst_format  = GBLENDER_TARGET_RGB24; break;
       case gr_pixel_mode_rgb565: dst_format = GBLENDER_TARGET_RGB565; break;
       default:
-          goto DefaultBlit;
+          goto LegacyBlit;
       }
 
      /* initialize blender when needed, i.e. when gamma changes
@@ -1935,7 +1920,7 @@
       return 1;
     }
 
-  DefaultBlit:
+  LegacyBlit:      /* no gamma correction, no caching */
 
     /* set up blitter and compute clipping.  Return immediately if needed */
     blit.source = *glyph;
diff --git a/graph/x11/grx11.c b/graph/x11/grx11.c
index b757a15..611a5cd 100644
--- a/graph/x11/grx11.c
+++ b/graph/x11/grx11.c
@@ -362,7 +362,7 @@ typedef  unsigned long   uint32;
 
   static const grX11Format  gr_x11_format_bgr565 =
   {
-    16, 16, 0x001F, 0x7E00, 0xF800U,
+    16, 16, 0x001F, 0x07E0, 0xF800U,
     gr_x11_convert_rgb_to_bgr565,
     gr_x11_convert_gray_to_rgb565  /* the same for bgr565! */
   };
@@ -442,7 +442,7 @@ typedef  unsigned long   uint32;
 
   static const grX11Format  gr_x11_format_rgb555 =
   {
-    15, 16, 0x7C00, 0x3E00, 0x001F,
+    15, 16, 0x7C00, 0x03E0, 0x001F,
     gr_x11_convert_rgb_to_rgb555,
     gr_x11_convert_gray_to_rgb555
   };
@@ -491,7 +491,7 @@ typedef  unsigned long   uint32;
 
   static const grX11Format gr_x11_format_bgr555 =
   {
-    15, 16, 0x1F00, 0x3E00, 0x7C00,
+    15, 16, 0x001F, 0x03E0, 0x7C00,
     gr_x11_convert_rgb_to_bgr555,
     gr_x11_convert_gray_to_rgb555  /* the same for bgr555! */
   };



reply via email to

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