Commit 4b58cf47cc5cd3ffc203f5fbe26865f4634ffc70

Dominik Röttsches 2020-12-16T17:18:56

[base] Fill 'COLR' v1 API templates to make them work (#59703). * src/base/ftobjs.c (FT_Get_Color_Glyph_Paint, FT_Get_Paint_Layers, FT_Get_Paint, FT_Get_Colorline_Stops): Add basic sanity checks, check for existence of `FT_Face`, check arguments and delegate calls for the respective 'COLR' v1 API to the SFNT driver.

diff --git a/ChangeLog b/ChangeLog
index 1e8622a..33fa5a5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2020-12-16  Dominik Röttsches  <drott@chromium.org>
 
+	[base] Fill 'COLR' v1 API templates to make them work (#59703).
+
+	* src/base/ftobjs.c (FT_Get_Color_Glyph_Paint, FT_Get_Paint_Layers,
+	FT_Get_Paint, FT_Get_Colorline_Stops): Add basic sanity checks,
+	check for existence of `FT_Face`, check arguments and delegate calls
+	for the respective 'COLR' v1 API to the SFNT driver.
+
+2020-12-16  Dominik Röttsches  <drott@chromium.org>
+
 	[sfnt] Register 'COLR' v1 API in driver (#59703).
 
 	* include/freetype/internal/sfnt.h (TT_Get_Color_Glyph_Paint_Func,
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 061d119..a7010f9 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -5568,39 +5568,111 @@
   }
 
 
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF ( FT_Bool )
   FT_Get_Color_Glyph_Paint( FT_Face          face,
                             FT_UInt          base_glyph,
                             FT_OpaquePaint*  paint )
   {
-    return 0;
+    TT_Face       ttface;
+    SFNT_Service  sfnt;
+
+
+    if ( !face || !paint )
+      return 0;
+
+    if ( !FT_IS_SFNT( face ) )
+      return 0;
+
+    ttface = (TT_Face)face;
+    sfnt   = (SFNT_Service)ttface->sfnt;
+
+    if ( sfnt->get_colr_layer )
+      return sfnt->get_colr_glyph_paint( ttface, base_glyph, paint );
+    else
+      return 0;
   }
 
 
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF ( FT_Bool )
   FT_Get_Paint_Layers( FT_Face            face,
                        FT_LayerIterator*  layer_iterator,
                        FT_OpaquePaint*    paint )
   {
-    return 0;
+    TT_Face       ttface;
+    SFNT_Service  sfnt;
+
+
+    if ( !face || !paint || !layer_iterator )
+      return 0;
+
+    if ( !FT_IS_SFNT( face ) )
+      return 0;
+
+    ttface = (TT_Face)face;
+    sfnt   = (SFNT_Service)ttface->sfnt;
+
+    if ( sfnt->get_paint_layers )
+      return sfnt->get_paint_layers( ttface, layer_iterator, paint );
+    else
+      return 0;
   }
 
 
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF( FT_Bool )
   FT_Get_Paint( FT_Face face,
                 FT_OpaquePaint  opaque_paint,
                 FT_COLR_Paint*  paint )
   {
-    return 0;
+    TT_Face       ttface;
+    SFNT_Service  sfnt;
+
+
+    if ( !face || !paint || !paint )
+      return 0;
+
+    if ( !FT_IS_SFNT( face ) )
+      return 0;
+
+    ttface = (TT_Face)face;
+    sfnt   = (SFNT_Service)ttface->sfnt;
+
+    if ( sfnt->get_paint )
+      return sfnt->get_paint( ttface, opaque_paint, paint );
+    else
+      return 0;
   }
 
 
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF ( FT_Bool )
   FT_Get_Colorline_Stops ( FT_Face                face,
                            FT_ColorStop *         color_stop,
                            FT_ColorStopIterator  *iterator )
   {
-    return 0;
+    TT_Face       ttface;
+    SFNT_Service  sfnt;
+
+
+    if ( !face || !color_stop || !iterator )
+      return 0;
+
+    if ( !FT_IS_SFNT( face ) )
+      return 0;
+
+    ttface = (TT_Face)face;
+    sfnt   = (SFNT_Service)ttface->sfnt;
+
+    if ( sfnt->get_colorline_stops )
+      return sfnt->get_colorline_stops ( ttface, color_stop, iterator );
+    else
+      return 0;
   }