freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master 88738e9: [ftview] Add more control for color-la


From: Werner LEMBERG
Subject: [freetype2-demos] master 88738e9: [ftview] Add more control for color-layered glyphs.
Date: Sat, 23 Feb 2019 00:39:20 -0500 (EST)

branch: master
commit 88738e9f6c1b0c4b9519ee43d572b6af4e74e658
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [ftview] Add more control for color-layered glyphs.
    
    Key `z' toggles color-layered glyph usage.
    Keys `i' and `I' cycle through color palettes.
    
    * src/ftcommon.h (TFont): Add `palette_index' field.
    (FTDemo_Handle): Add `use_layers' field.
    * src/ftcommon.c (FTDemo_New, FTDemo_Install_Font): Initialize new
    structure elements.
    
    * src/ftview.c (Render_All): Select palette; use `use_layers'.
    (event_help): Updated.
    (event_palette_change): New function.
    (Process_Event): Handle keys `z', `i', and `I'.
    (write_header): Updated.
---
 ChangeLog      |  18 ++++++++++
 src/ftcommon.c |  13 ++++---
 src/ftcommon.h |  14 ++++----
 src/ftview.c   | 106 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 4 files changed, 124 insertions(+), 27 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cf7880e..736a39e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2019-02-23  Werner Lemberg  <address@hidden>
+
+       [ftview] Add more control for color-layered glyphs.
+
+       Key `z' toggles color-layered glyph usage.
+       Keys `i' and `I' cycle through color palettes.
+
+       * src/ftcommon.h (TFont): Add `palette_index' field.
+       (FTDemo_Handle): Add `use_layers' field.
+       * src/ftcommon.c (FTDemo_New, FTDemo_Install_Font): Initialize new
+       structure elements.
+
+       * src/ftview.c (Render_All): Select palette; use `use_layers'.
+       (event_help): Updated.
+       (event_palette_change): New function.
+       (Process_Event): Handle keys `z', `i', and `I'.
+       (write_header): Updated.
+
 2019-02-22  Werner Lemberg  <address@hidden>
 
        Minor doc string fixes.
diff --git a/src/ftcommon.c b/src/ftcommon.c
index c07ad9b..c948fa6 100644
--- a/src/ftcommon.c
+++ b/src/ftcommon.c
@@ -311,11 +311,12 @@
 
     handle->encoding = FT_ENCODING_ORDER;
 
-    handle->hinted    = 1;
-    handle->use_sbits = 1;
-    handle->use_color = 1;
-    handle->autohint  = 0;
-    handle->lcd_mode  = LCD_MODE_AA;
+    handle->hinted     = 1;
+    handle->use_sbits  = 1;
+    handle->use_color  = 1;
+    handle->use_layers = 1;
+    handle->autohint   = 0;
+    handle->lcd_mode   = LCD_MODE_AA;
 
     handle->use_sbits_cache = 1;
 
@@ -444,6 +445,8 @@
         else
           font->cmap_index = face->num_charmaps;  /* FT_ENCODING_ORDER */
 
+        font->palette_index = 0;
+
         if ( handle->preload )
         {
           FILE*   file = fopen( filename, "rb" );
diff --git a/src/ftcommon.h b/src/ftcommon.h
index 3e8f5b5..094232c 100644
--- a/src/ftcommon.h
+++ b/src/ftcommon.h
@@ -131,6 +131,7 @@
     const char*  filepathname;
     int          face_index;
     int          cmap_index;
+    int          palette_index;
     int          num_indices;
     void*        file_address;  /* for preloaded files */
     size_t       file_size;
@@ -198,12 +199,13 @@
     FT_Int32        load_flags;
 
     /* call FTDemo_Update_Current_Flags after setting any of the following 
fields */
-    int             hinted;            /* is glyph hinting active?    */
-    int             use_sbits;         /* do we use embedded bitmaps? */
-    int             use_color;         /* do we use coloured glyphs?  */
-    int             autohint;          /* force auto-hinting          */
-    int             lcd_mode;          /* mono, aa, light, vrgb, ...  */
-    int             preload;           /* force font file preloading  */
+    int             hinted;            /* is glyph hinting active?        */
+    int             use_sbits;         /* do we use embedded bitmaps?     */
+    int             use_color;         /* do we use coloured glyphs?      */
+    int             use_layers;        /* do we use color-layered glyphs? */
+    int             autohint;          /* force auto-hinting              */
+    int             lcd_mode;          /* mono, aa, light, vrgb, ...      */
+    int             preload;           /* force font file preloading      */
 
     /* don't touch the following fields! */
 
diff --git a/src/ftview.c b/src/ftview.c
index 31f89f0..38d0815 100644
--- a/src/ftview.c
+++ b/src/ftview.c
@@ -186,7 +186,6 @@
 
 
     error = FTDemo_Get_Size( handle, &size );
-
     if ( error )
     {
       /* probably a non-existent bitmap font size */
@@ -293,7 +292,6 @@
 
 
     error = FTDemo_Get_Size( handle, &size );
-
     if ( error )
     {
       /* probably a non-existent bitmap font size */
@@ -446,8 +444,9 @@
     face = size->face;
     slot = face->glyph;
 
-    /* XXX handle palette index */
-    error = FT_Palette_Select( face, 0, &palette );
+    error = FT_Palette_Select( face,
+                               handle->current_font->palette_index,
+                               &palette );
     if ( error )
       palette = NULL;
 
@@ -473,7 +472,7 @@
                                               &layer_color_idx,
                                               &iterator );
 
-      if ( palette && have_layers /* && XXX handle->use_layers */ )
+      if ( palette && have_layers && handle->use_layers )
       {
         FT_Int32  load_flags = handle->load_flags;
 
@@ -826,9 +825,11 @@
     grWriteln( "  space     cycle forwards                G         vertical 
BGR (LCD)      " );
     grWriteln( "  backspace cycle backwards               k, l      cycle back 
and forth    " );
     grWriteln( "                                                               
             " );
-    grWriteln( "b           toggle embedded bitmaps     x, X        adjust 
horizontal       " );
-    grWriteln( "                                                     
emboldening (in mode 2)" );
-    grWriteln( "c           toggle coloured glyphs      y, Y        adjust 
vertical         " );
+    grWriteln( "b           toggle embedded bitmaps     i, I        cycle 
through color     " );
+    grWriteln( "                                                      color 
palette         " );
+    grWriteln( "c           toggle coloured bitmaps     x, X        adjust 
horizontal       " );
+    grWriteln( "z           toggle colour-layered                    
emboldening (in mode 2)" );
+    grWriteln( "              glyphs                    y, Y        adjust 
vertical         " );
     grWriteln( "                                                     
emboldening (in mode 2)" );
     grWriteln( "K           toggle cache modes          s, S        adjust 
slanting         " );
     grWriteln( "                                                     (in mode 
2)            " );
@@ -1072,6 +1073,44 @@
 
 
   static int
+  event_palette_change( int  delta )
+  {
+    FT_Size  size;
+    FT_Face  face;
+
+    FT_Palette_Data  palette;
+
+    int  palette_index     = handle->current_font->palette_index;
+    int  old_palette_index = palette_index;
+
+
+    error = FTDemo_Get_Size( handle, &size );
+    if ( error )
+    {
+      /* probably a non-existent bitmap font size */
+      return 0;
+    }
+
+    face = size->face;
+
+    error = FT_Palette_Data_Get( face, &palette );
+    if ( error || !palette.num_palettes )
+      return 0;
+
+    palette_index += delta;
+
+    if ( palette_index < 0 )
+      palette_index = palette.num_palettes - 1;
+    else if ( palette_index >= palette.num_palettes )
+      palette_index = 0;
+
+    handle->current_font->palette_index = palette_index;
+
+    return old_palette_index == palette_index ? 0 : 1;
+  }
+
+
+  static int
   Process_Event( grEvent*  event )
   {
     int  ret = 0;
@@ -1130,6 +1169,20 @@
       status.update = 1;
       break;
 
+    case grKEY( 'z' ):
+      handle->use_layers = !handle->use_layers;
+      FTDemo_Update_Current_Flags( handle );
+      status.update = 1;
+      break;
+
+    case grKEY( 'i' ):
+      status.update = event_palette_change( 1 );
+      break;
+
+    case grKEY( 'I' ):
+      status.update = event_palette_change( -1 );
+      break;
+
     case grKEY( 'K' ):
       handle->use_sbits_cache = !handle->use_sbits_cache;
       status.update = 1;
@@ -1414,6 +1467,11 @@
     char  buf[256];
     int   line = 4;
 
+    FT_Face  face;
+
+
+    FTC_Manager_LookupFace( handle->cache_manager,
+                            handle->scaler.face_id, &face );
 
     FTDemo_Draw_Header( handle, display, status.ptsize, status.res,
                         status.render_mode != RENDER_MODE_TEXT      &&
@@ -1535,13 +1593,10 @@
          handle->lcd_mode != LCD_MODE_LIGHT )
     {
       /* hinting engine */
-      FT_Face      face;
       FT_Module    module;
       const char*  hinting_engine = NULL;
 
 
-      FTC_Manager_LookupFace( handle->cache_manager,
-                              handle->scaler.face_id, &face );
       module = &face->driver->root;
 
       if ( !strcmp( module->clazz->module_name, "cff" ) )
@@ -1625,11 +1680,30 @@
     grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
                        buf, display->fore_color );
 
-    /* color */
-    sprintf( buf, "color: %s",
-                  handle->use_color ? "on" : "off" );
-    grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
-                       buf, display->fore_color );
+    if ( FT_HAS_COLOR( face ) )
+    {
+      sprintf( buf, "color:" );
+      grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
+                         buf, display->fore_color );
+
+      /* color bitmaps */
+      sprintf( buf, "  bitmaps: %s",
+                    handle->use_color ? "on" : "off" );
+      grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
+                         buf, display->fore_color );
+
+      /* color-layered glyphs */
+      sprintf( buf, "  outlines: %s",
+                    handle->use_layers ? "on" : "off" );
+      grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
+                         buf, display->fore_color );
+
+      /* color palette */
+      sprintf( buf, "  palette idx: %d",
+                    handle->current_font->palette_index );
+      grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
+                         buf, display->fore_color );
+    }
 
     /* cache */
     sprintf( buf, "cache: %s",



reply via email to

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