freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master 8f40510: [ftview] Handle foreground COLR.


From: Werner Lemberg
Subject: [freetype2-demos] master 8f40510: [ftview] Handle foreground COLR.
Date: Sat, 19 Feb 2022 01:38:27 -0500 (EST)

branch: master
commit 8f40510ddc4dee84e22f78e1df923ab52f13fab8
Author: Ben Wagner <bungeman@chromium.org>
Commit: Werner Lemberg <wl@gnu.org>

    [ftview] Handle foreground COLR.
    
    * src/ftview.c (Render_All): handle 0xFFFF `layer_color_idx` without
    crashing.
---
 src/ftview.c | 48 ++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/ftview.c b/src/ftview.c
index bce4126..d0f83f0 100644
--- a/src/ftview.c
+++ b/src/ftview.c
@@ -410,12 +410,16 @@
   Render_All( int  num_indices,
               int  offset )
   {
-    int           start_x, start_y, step_y, x, y, width;
-    int           i, have_topleft;
+    int  start_x, start_y, step_y, x, y, width;
+    int  i, have_topleft;
+
     FT_Size       size;
     FT_Face       face;
     FT_GlyphSlot  slot;
-    FT_Color*     palette;
+
+    FT_Color*        palette;
+    FT_Palette_Data  palette_data;
+    FT_UShort        palette_index;
 
 
     error = FTDemo_Get_Size( handle, &size );
@@ -429,11 +433,11 @@
     face = size->face;
     slot = face->glyph;
 
-    error = FT_Palette_Select( face,
-                               (FT_UShort)handle->current_font->palette_index,
-                               &palette );
-    if ( error )
+    palette_index = (FT_UShort)handle->current_font->palette_index;
+    if ( FT_Palette_Select( face, palette_index, &palette ) )
       palette = NULL;
+    if ( FT_Palette_Data_Get( face, &palette_data ) )
+      return -1;
 
     have_topleft = 0;
 
@@ -480,6 +484,7 @@
         do
         {
           FT_Vector  slot_offset;
+          FT_Color   color;
 
 
           error = FT_Load_Glyph( face, layer_glyph_idx, load_flags );
@@ -489,12 +494,39 @@
           slot_offset.x = slot->bitmap_left * 64;
           slot_offset.y = slot->bitmap_top * 64;
 
+          if ( layer_color_idx == 0xFFFF )
+          {
+            // TODO: FT_Palette_Get_Foreground_Color
+            if ( palette_data.palette_flags                  &&
+               ( palette_data.palette_flags[palette_index] &
+                   FT_PALETTE_FOR_DARK_BACKGROUND          ) )
+            {
+              /* white opaque */
+              color.blue  = 0xFF;
+              color.green = 0xFF;
+              color.red   = 0xFF;
+              color.alpha = 0xFF;
+            }
+            else
+            {
+              /* black opaque */
+              color.blue  = 0x00;
+              color.green = 0x00;
+              color.red   = 0x00;
+              color.alpha = 0xFF;
+            }
+          }
+          else if ( layer_color_idx < palette_data.num_palette_entries )
+            color = palette[layer_color_idx];
+          else
+            continue;
+
           error = FT_Bitmap_Blend( handle->library,
                                    &slot->bitmap,
                                    slot_offset,
                                    &bitmap,
                                    &bitmap_offset,
-                                   palette[layer_color_idx] );
+                                   color );
 
         } while ( FT_Get_Color_Glyph_Layer( face,
                                             glyph_idx,



reply via email to

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