freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master 54b332a: [sfnt] Separate `CPAL' and `COLR' table hand


From: Werner LEMBERG
Subject: [freetype2] master 54b332a: [sfnt] Separate `CPAL' and `COLR' table handling.
Date: Wed, 13 Jun 2018 02:54:58 -0400 (EDT)

branch: master
commit 54b332aaf95cf581fc3a967bdf3724a69eba75f8
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [sfnt] Separate `CPAL' and `COLR' table handling.
    
    Later on we want to support the `SVG' table also, which needs `CPAL'
    (but not `COLR').
    
    * include/freetype/internal/sfnt.h (SFNT_Interface): Add `load_cpal'
    and `free_cpal' fields.
    (FT_DEFINE_SFNT_INTERFACE): Updated.
    
    * include/freetype/internal/tttypes.h (TT_FaceRec): Replace
    `colr_and_cpal' fields with `cpal' and `colr'.
    
    * src/sfnt/sfdriver.c (sfnt_interface): Updated.
    
    * src/sfnt/sfobjs.c (sfnt_load_face, sfnt_done_face): Updated.
    
    * src/sfnt/ttcolr.c (Colr, Cpal): Add `table' field.
    (ColrCpal): Removed.
    (tt_face_load_colr): Split off CPAL handling into...
    (tt_face_load_cpal): ... this new function.
    (tt_face_free_colr): Split off CPAL handling into...
    (tt_face_free_cpal): ... this new function.
    (tt_face_load_colr_layers, tt_face_palette_set): Updated.
    
    * src/sfnt/ttcolr.h: Updated.
    
    * src/truetype/ttgload.c (TT_Load_Glyph): Updated.
---
 ChangeLog                           |  30 +++++
 include/freetype/internal/sfnt.h    |   6 +
 include/freetype/internal/tttypes.h |  14 +-
 src/sfnt/sfdriver.c                 |   4 +
 src/sfnt/sfobjs.c                   |  12 +-
 src/sfnt/ttcolr.c                   | 259 ++++++++++++++++++++----------------
 src/sfnt/ttcolr.h                   |   7 +
 src/truetype/ttgload.c              |   4 +-
 8 files changed, 209 insertions(+), 127 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a873cfd..eb751ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2018-06-13  Werner Lemberg  <address@hidden>
+
+       [sfnt] Separate `CPAL' and `COLR' table handling.
+
+       Later on we want to support the `SVG' table also, which needs `CPAL'
+       (but not `COLR').
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface): Add `load_cpal'
+       and `free_cpal' fields.
+       (FT_DEFINE_SFNT_INTERFACE): Updated.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Replace
+       `colr_and_cpal' fields with `cpal' and `colr'.
+
+       * src/sfnt/sfdriver.c (sfnt_interface): Updated.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face, sfnt_done_face): Updated.
+
+       * src/sfnt/ttcolr.c (Colr, Cpal): Add `table' field.
+       (ColrCpal): Removed.
+       (tt_face_load_colr): Split off CPAL handling into...
+       (tt_face_load_cpal): ... this new function.
+       (tt_face_free_colr): Split off CPAL handling into...
+       (tt_face_free_cpal): ... this new function.
+       (tt_face_load_colr_layers, tt_face_palette_set): Updated.
+
+       * src/sfnt/ttcolr.h: Updated.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Updated.
+
 2018-06-12  Werner Lemberg  <address@hidden>
 
        [sfnt] Fix `sizeof' thinko.
diff --git a/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h
index aac8e9b..731c7fe 100644
--- a/include/freetype/internal/sfnt.h
+++ b/include/freetype/internal/sfnt.h
@@ -763,7 +763,9 @@ FT_BEGIN_HEADER
     TT_Set_SBit_Strike_Func      set_sbit_strike;
     TT_Load_Strike_Metrics_Func  load_strike_metrics;
 
+    TT_Load_Table_Func           load_cpal;
     TT_Load_Table_Func           load_colr;
+    TT_Free_Table_Func           free_cpal;
     TT_Free_Table_Func           free_colr;
     TT_Set_Palette_Func          set_palette;
     TT_Load_Colr_Layer_Func      load_colr_layer;
@@ -811,7 +813,9 @@ FT_BEGIN_HEADER
           free_eblc_,                    \
           set_sbit_strike_,              \
           load_strike_metrics_,          \
+          load_cpal_,                    \
           load_colr_,                    \
+          free_cpal_,                    \
           free_colr_,                    \
           set_palette_,                  \
           load_colr_layer_,              \
@@ -849,7 +853,9 @@ FT_BEGIN_HEADER
     free_eblc_,                          \
     set_sbit_strike_,                    \
     load_strike_metrics_,                \
+    load_cpal_,                          \
     load_colr_,                          \
+    free_cpal_,                          \
     free_colr_,                          \
     set_palette_,                        \
     load_colr_layer_,                    \
diff --git a/include/freetype/internal/tttypes.h 
b/include/freetype/internal/tttypes.h
index 4d63148..945b250 100644
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1546,10 +1546,13 @@ FT_BEGIN_HEADER
    *     exposed by the API and the indices used in
    *     the font's sbit table.
    *
-   *   colr_and_cpal ::
-   *     A pointer to data related to `COLR' and
-   *     `CPAL' tables.  NULL if tables are not
-   *     available.
+   *   cpal ::
+   *     A pointer to data related to the `CPAL' table.  NULL if the table
+   *     is not available.
+   *
+   *   colr ::
+   *     A pointer to data related to the `COLR' table.  NULL if the table
+   *     is not available.
    *
    *   kern_table ::
    *     A pointer to the `kern' table.
@@ -1780,7 +1783,8 @@ FT_BEGIN_HEADER
 #endif
 
     /* since 2.10 */
-    void*                 colr_and_cpal;
+    void*                 cpal;
+    void*                 colr;
 
   } TT_FaceRec;
 
diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c
index dd3f801..ff1305e 100644
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -1257,8 +1257,12 @@
     PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
                    /* TT_Load_Strike_Metrics_Func  load_strike_metrics */
 
+    PUT_COLOR_LAYERS( tt_face_load_cpal ),
+                            /* TT_Load_Table_Func      load_cpal       */
     PUT_COLOR_LAYERS( tt_face_load_colr ),
                             /* TT_Load_Table_Func      load_colr       */
+    PUT_COLOR_LAYERS( tt_face_free_cpal ),
+                            /* TT_Free_Table_Func      free_cpal       */
     PUT_COLOR_LAYERS( tt_face_free_colr ),
                             /* TT_Free_Table_Func      free_colr       */
     PUT_COLOR_LAYERS( tt_face_palette_set ),
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
index 6a431ed..5dc41b4 100644
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -1341,9 +1341,10 @@
     if ( sfnt->load_eblc )
       LOAD_( eblc );
 
-    if ( sfnt->load_colr )
+    /* colored glyph support */
+    if ( sfnt->load_cpal )
     {
-      /* Ignore error.  Missing optional colr/cpal is okay. */
+      LOAD_( cpal );
       LOAD_( colr );
     }
 
@@ -1401,7 +1402,7 @@
        */
       if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC ||
            face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ||
-           face->colr_and_cpal                              )
+           face->colr                                       )
         flags |= FT_FACE_FLAG_COLOR;      /* color glyphs */
 
       if ( has_outline == TRUE )
@@ -1746,8 +1747,11 @@
         sfnt->free_eblc( face );
 
       /* destroy color table data if it is loaded */
-      if ( sfnt->free_colr )
+      if ( sfnt->free_cpal )
+      {
+        sfnt->free_cpal( face );
         sfnt->free_colr( face );
+      }
     }
 
 #ifdef TT_CONFIG_OPTION_BDF
diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c
index fee4840..a087ee2 100644
--- a/src/sfnt/ttcolr.c
+++ b/src/sfnt/ttcolr.c
@@ -57,18 +57,6 @@
   } BaseGlyphRecord;
 
 
-  typedef struct Colr_
-  {
-    FT_UShort  version;
-    FT_UShort  num_base_glyphs;
-    FT_UShort  num_layers;
-
-    FT_Byte*  base_glyphs;
-    FT_Byte*  layers;
-
-  } Colr;
-
-
   /* all data from `CPAL' not covered in FT_Palette_Data */
   typedef struct Cpal_
   {
@@ -79,20 +67,25 @@
     FT_Byte*  color_indices; /* Index of each palette's first color record */
                              /* in the combined color record array.        */
 
+    /* The memory which backs up the `CPAL' table. */
+    void*  table;
+
   } Cpal;
 
 
-  typedef struct ColrCpal_
+  typedef struct Colr_
   {
-    /* Accessors into the colr/cpal tables. */
-    Colr  colr;
-    Cpal  cpal;
+    FT_UShort  version;
+    FT_UShort  num_base_glyphs;
+    FT_UShort  num_layers;
 
-    /* The memory which backs up colr/cpal tables. */
-    void*  colr_table;
-    void*  cpal_table;
+    FT_Byte*  base_glyphs;
+    FT_Byte*  layers;
+
+    /* The memory which backs up the `COLR' table. */
+    void*  table;
 
-  } ColrCpal;
+  } Colr;
 
 
   /**************************************************************************
@@ -106,101 +99,55 @@
 
 
   FT_LOCAL_DEF( FT_Error )
-  tt_face_load_colr( TT_Face    face,
+  tt_face_load_cpal( TT_Face    face,
                      FT_Stream  stream )
   {
     FT_Error   error;
     FT_Memory  memory = face->root.memory;
 
-    FT_Byte*  colr_table = NULL;
-    FT_Byte*  cpal_table = NULL;
-    FT_Byte*  p          = NULL;
+    FT_Byte*  table = NULL;
+    FT_Byte*  p     = NULL;
 
-    Colr       colr;
-    Cpal       cpal;
-    ColrCpal*  cc = NULL;
+    Cpal*  cpal = NULL;
 
-    FT_ULong  base_glyph_offset, layer_offset, colors_offset;
+    FT_ULong  colors_offset;
     FT_ULong  table_size;
 
 
-    /*
-     * COLR
-     */
-
-    error = face->goto_table( face, TTAG_COLR, stream, &table_size );
-    if ( error )
-      goto NoColor;
-
-    if ( table_size < COLR_HEADER_SIZE )
-      goto InvalidTable;
-
-    if ( FT_FRAME_EXTRACT( table_size, colr_table ) )
-      goto NoColor;
-
-    p = colr_table;
-
-    FT_ZERO( &colr );
-    colr.version = FT_NEXT_USHORT( p );
-    if ( colr.version != 0 )
-      goto InvalidTable;
-
-    colr.num_base_glyphs = FT_NEXT_USHORT( p );
-    base_glyph_offset    = FT_NEXT_ULONG( p );
-
-    if ( base_glyph_offset >= table_size )
-      goto InvalidTable;
-    if ( colr.num_base_glyphs * BASE_GLYPH_SIZE >
-           table_size - base_glyph_offset )
-      goto InvalidTable;
-
-    layer_offset    = FT_NEXT_ULONG( p );
-    colr.num_layers = FT_NEXT_USHORT( p );
-
-    if ( layer_offset >= table_size )
-      goto InvalidTable;
-    if ( colr.num_layers * LAYER_SIZE > table_size - layer_offset )
-      goto InvalidTable;
-
-    colr.base_glyphs = (FT_Byte*)( colr_table + base_glyph_offset );
-    colr.layers      = (FT_Byte*)( colr_table + layer_offset      );
-
-    /*
-     * CPAL
-     */
-
     error = face->goto_table( face, TTAG_CPAL, stream, &table_size );
     if ( error )
-      goto NoColor;
+      goto NoCpal;
 
     if ( table_size < CPAL_V0_HEADER_BASE_SIZE )
       goto InvalidTable;
 
-    if ( FT_FRAME_EXTRACT( table_size, cpal_table ) )
-      goto NoColor;
+    if ( FT_FRAME_EXTRACT( table_size, table ) )
+      goto NoCpal;
 
-    p = cpal_table;
+    p = table;
 
-    FT_ZERO( &cpal );
-    cpal.version = FT_NEXT_USHORT( p );
-    if ( cpal.version > 1 )
+    if ( FT_NEW( cpal ) )
+      goto NoCpal;
+
+    cpal->version = FT_NEXT_USHORT( p );
+    if ( cpal->version > 1 )
       goto InvalidTable;
 
     face->palette_data.num_palette_entries = FT_NEXT_USHORT( p );
     face->palette_data.num_palettes        = FT_NEXT_USHORT( p );
 
-    cpal.num_colors = FT_NEXT_USHORT( p );
-    colors_offset   = FT_NEXT_ULONG( p );
+    cpal->num_colors = FT_NEXT_USHORT( p );
+    colors_offset    = FT_NEXT_ULONG( p );
 
     if ( colors_offset >= table_size )
       goto InvalidTable;
-    if ( cpal.num_colors * COLOR_SIZE > table_size - colors_offset )
+    if ( cpal->num_colors * COLOR_SIZE > table_size - colors_offset )
       goto InvalidTable;
 
-    cpal.color_indices = p;
-    cpal.colors        = (FT_Byte*)( cpal_table + colors_offset );
+    cpal->color_indices = p;
+    cpal->colors        = (FT_Byte*)( table + colors_offset );
 
-    if ( cpal.version == 1 )
+    if ( cpal->version == 1 )
     {
       FT_ULong    type_offset, label_offset, entry_label_offset;
       FT_UShort*  array = NULL;
@@ -223,9 +170,9 @@
           goto InvalidTable;
 
         if ( FT_QNEW_ARRAY( array, face->palette_data.num_palettes ) )
-          goto NoColor;
+          goto NoCpal;
 
-        p     = cpal_table + type_offset;
+        p     = table + type_offset;
         q     = array;
         limit = q + face->palette_data.num_palettes;
 
@@ -244,9 +191,9 @@
           goto InvalidTable;
 
         if ( FT_QNEW_ARRAY( array, face->palette_data.num_palettes ) )
-          goto NoColor;
+          goto NoCpal;
 
-        p     = cpal_table + label_offset;
+        p     = table + label_offset;
         q     = array;
         limit = q + face->palette_data.num_palettes;
 
@@ -265,9 +212,9 @@
           goto InvalidTable;
 
         if ( FT_QNEW_ARRAY( array, face->palette_data.num_palette_entries ) )
-          goto NoColor;
+          goto NoCpal;
 
-        p     = cpal_table + entry_label_offset;
+        p     = table + entry_label_offset;
         q     = array;
         limit = q + face->palette_data.num_palette_entries;
 
@@ -278,20 +225,14 @@
       }
     }
 
-    if ( FT_NEW( cc ) )
-      goto NoColor;
-
-    cc->colr       = colr;
-    cc->cpal       = cpal;
-    cc->colr_table = colr_table;
-    cc->cpal_table = cpal_table;
+    cpal->table = table;
 
-    face->colr_and_cpal = cc;
+    face->cpal = cpal;
 
     /* set up default palette */
     if ( FT_NEW_ARRAY( face->palette,
                        face->palette_data.num_palette_entries ) )
-      goto NoColor;
+      goto NoCpal;
 
     tt_face_palette_set( face, 0 );
 
@@ -300,11 +241,9 @@
   InvalidTable:
     error = FT_THROW( Invalid_Table );
 
-  NoColor:
-    FT_FRAME_RELEASE( colr_table );
-    FT_FRAME_RELEASE( cpal_table );
-
-    FT_FREE( cc );
+  NoCpal:
+    FT_FRAME_RELEASE( table );
+    FT_FREE( cpal );
 
     /* arrays in `face->palette_data' and `face->palette' */
     /* are freed in `sfnt_done_face'                      */
@@ -313,21 +252,111 @@
   }
 
 
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_colr( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = face->root.memory;
+
+    FT_Byte*  table = NULL;
+    FT_Byte*  p     = NULL;
+
+    Colr*  colr = NULL;
+
+    FT_ULong  base_glyph_offset, layer_offset;
+    FT_ULong  table_size;
+
+
+    /* `COLR' always needs `CPAL' */
+    if ( !face->cpal )
+      return FT_THROW( Invalid_File_Format );
+
+    error = face->goto_table( face, TTAG_COLR, stream, &table_size );
+    if ( error )
+      goto NoColr;
+
+    if ( table_size < COLR_HEADER_SIZE )
+      goto InvalidTable;
+
+    if ( FT_FRAME_EXTRACT( table_size, table ) )
+      goto NoColr;
+
+    p = table;
+
+    if ( FT_NEW( colr ) )
+      goto NoColr;
+
+    colr->version = FT_NEXT_USHORT( p );
+    if ( colr->version != 0 )
+      goto InvalidTable;
+
+    colr->num_base_glyphs = FT_NEXT_USHORT( p );
+    base_glyph_offset     = FT_NEXT_ULONG( p );
+
+    if ( base_glyph_offset >= table_size )
+      goto InvalidTable;
+    if ( colr->num_base_glyphs * BASE_GLYPH_SIZE >
+           table_size - base_glyph_offset )
+      goto InvalidTable;
+
+    layer_offset     = FT_NEXT_ULONG( p );
+    colr->num_layers = FT_NEXT_USHORT( p );
+
+    if ( layer_offset >= table_size )
+      goto InvalidTable;
+    if ( colr->num_layers * LAYER_SIZE > table_size - layer_offset )
+      goto InvalidTable;
+
+    colr->base_glyphs = (FT_Byte*)( table + base_glyph_offset );
+    colr->layers      = (FT_Byte*)( table + layer_offset      );
+    colr->table       = table;
+
+    face->colr = colr;
+
+    return FT_Err_Ok;
+
+  InvalidTable:
+    error = FT_THROW( Invalid_Table );
+
+  NoColr:
+    FT_FRAME_RELEASE( table );
+    FT_FREE( colr );
+
+    return error;
+  }
+
+
   FT_LOCAL_DEF( void )
-  tt_face_free_colr( TT_Face  face )
+  tt_face_free_cpal( TT_Face  face )
   {
     FT_Stream  stream = face->root.stream;
     FT_Memory  memory = face->root.memory;
 
-    ColrCpal*  colr_and_cpal = (ColrCpal*)face->colr_and_cpal;
+    Cpal*  cpal = (Cpal*)face->cpal;
 
 
-    if ( colr_and_cpal )
+    if ( cpal )
     {
-      FT_FRAME_RELEASE( colr_and_cpal->colr_table );
-      FT_FRAME_RELEASE( colr_and_cpal->cpal_table );
+      FT_FRAME_RELEASE( cpal->table );
+      FT_FREE( cpal );
+    }
+  }
+
 
-      FT_FREE( face->colr_and_cpal );
+  FT_LOCAL_DEF( void )
+  tt_face_free_colr( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Memory  memory = face->root.memory;
+
+    Colr*  colr = (Colr*)face->colr;
+
+
+    if ( colr )
+    {
+      FT_FRAME_RELEASE( colr->table );
+      FT_FREE( colr );
     }
   }
 
@@ -377,8 +406,7 @@
     FT_Error   error;
     FT_Memory  memory = face->root.memory;
 
-    ColrCpal*  colr_and_cpal = (ColrCpal *)face->colr_and_cpal;
-    Colr*      colr          = &colr_and_cpal->colr;
+    Colr*  colr = (Colr*)face->colr;
 
     BaseGlyphRecord  glyph_record;
     FT_Glyph_Layer   layers = NULL;
@@ -441,8 +469,7 @@
   tt_face_palette_set( TT_Face  face,
                        FT_UInt  palette_index )
   {
-    ColrCpal*  colr_and_cpal = (ColrCpal *)face->colr_and_cpal;
-    Cpal*      cpal          = &colr_and_cpal->cpal;
+    Cpal*  cpal = (Cpal*)face->cpal;
 
     FT_Byte*   offset;
     FT_Byte*   p;
diff --git a/src/sfnt/ttcolr.h b/src/sfnt/ttcolr.h
index bb9b407..258f0f6 100644
--- a/src/sfnt/ttcolr.h
+++ b/src/sfnt/ttcolr.h
@@ -30,10 +30,17 @@ FT_BEGIN_HEADER
 
 
   FT_LOCAL( FT_Error )
+  tt_face_load_cpal( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( FT_Error )
   tt_face_load_colr( TT_Face    face,
                      FT_Stream  stream );
 
   FT_LOCAL( void )
+  tt_face_free_cpal( TT_Face  face );
+
+  FT_LOCAL( void )
   tt_face_free_colr( TT_Face  face );
 
   FT_LOCAL( FT_Error )
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index 574cdf6..c5e96e6 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -2906,8 +2906,8 @@
 
     /* The outline based algorithm took care of metrics. */
     /* Read additional color info if requested.          */
-    if ( ( load_flags & FT_LOAD_COLOR )          &&
-         ( (TT_Face)glyph->face )->colr_and_cpal )
+    if ( ( load_flags & FT_LOAD_COLOR ) &&
+         ( (TT_Face)glyph->face )->colr )
     {
       TT_Face       face   = (TT_Face)glyph->face;
       FT_Memory     memory = face->root.memory;



reply via email to

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