Commit 45145d348fd77196d6ae92a2e8f15f671725094e

Werner Lemberg 2018-06-12T06:02:59

Finish CPAL/COLR support (3/4). * src/base/ftcolor.c: Include FT_INTERNAL_SFNT_H. (FT_Palette_Select, FT_Palette_Set_Foreground_Color): Implement functions.

diff --git a/ChangeLog b/ChangeLog
index 604d3e5..c12b068 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2018-06-12  Werner Lemberg  <wl@gnu.org>
 
+	Finish CPAL/COLR support (3/4).
+
+	* src/base/ftcolor.c: Include FT_INTERNAL_SFNT_H.
+	(FT_Palette_Select, FT_Palette_Set_Foreground_Color): Implement
+	functions.
+
+2018-06-12  Werner Lemberg  <wl@gnu.org>
+
 	Finish CPAL/COLR support (2/4).
 
 	* src/sfnt/ttcolr.c (tt_face_palette_set): New function.
diff --git a/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h
index 7270d12..aac8e9b 100644
--- a/include/freetype/internal/sfnt.h
+++ b/include/freetype/internal/sfnt.h
@@ -533,9 +533,12 @@ FT_BEGIN_HEADER
    *
    * @Description:
    *   Blend the bitmap in `new_glyph' into `base_glyph' using the color
-   *   specified by `color_index'.
-   *
-   *   XXX: Handle foregound color
+   *   specified by `color_index'.  If `color_index' is 0xFFFF, use
+   *   `face->foreground_color' if `face->have_foreground_color' is set.
+   *   Otherwise check `face->palette_data.palette_type': If present and
+   *   @FT_PALETTE_USABLE_WITH_DARK_BACKGROUND is set, use BGRA value
+   *   0xFFFFFFFF (white opaque).  Otherwise use BGRA value 0x000000FF
+   *   (black opaque).
    *
    * @Input:
    *   face ::
diff --git a/src/base/ftcolor.c b/src/base/ftcolor.c
index 26f6569..acde08b 100644
--- a/src/base/ftcolor.c
+++ b/src/base/ftcolor.c
@@ -18,6 +18,7 @@
 
 #include <ft2build.h>
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_SFNT_H
 #include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_COLOR_H
 
@@ -47,6 +48,70 @@
     return FT_Err_Ok;
   }
 
+
+  /* documentation is in ftcolor.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Palette_Select( FT_Face     face,
+                     FT_UShort   palette_index,
+                     FT_Color*  *apalette )
+  {
+    FT_Error  error;
+
+    TT_Face       ttface;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !FT_IS_SFNT( face ) )
+    {
+      if ( apalette )
+        *apalette = NULL;
+
+      return FT_Err_Ok;
+    }
+
+    ttface = (TT_Face)face;
+    sfnt   = (SFNT_Service)ttface->sfnt;
+
+    error = sfnt->set_palette( ttface, palette_index );
+    if ( error )
+      return error;
+
+    ttface->palette_index = palette_index;
+
+    if ( apalette )
+      *apalette = ttface->palette;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftcolor.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Palette_Set_Foreground_Color( FT_Face   face,
+                                   FT_Color  foreground_color )
+  {
+    TT_Face  ttface;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !FT_IS_SFNT( face ) )
+      return FT_Err_Ok;
+
+    ttface = (TT_Face)face;
+
+    ttface->foreground_color      = foreground_color;
+    ttface->have_foreground_color = 1;
+
+    return FT_Err_Ok;
+  }
+
 #else /* !TT_CONFIG_OPTION_COLOR_LAYERS */
 
   FT_EXPORT_DEF( FT_Error )
@@ -60,6 +125,29 @@
     return FT_THROW( Unimplemented_Feature );
   }
 
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Palette_Select( FT_Face     face,
+                     FT_UShort   palette_index,
+                     FT_Color*  *apalette )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( palette_index );
+    FT_UNUSED( apalette );
+
+
+    return FT_THROW( Unimplemented_Feature );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Palette_Set_Foreground_Color( FT_Face   face,
+                                   FT_Color  foreground_color )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( foreground_color );
+  }
+
 #endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */