Commit be06a9d002cc1dc8b2e4e416538002a53c7e944c

Dominik Röttsches 2020-12-16T17:02:22

[sfnt] Add 'COLR' v1 API to iterate color stops (#59703). * src/sfnt/ttcolr.c (tt_face_get_colorline_stops): New function to return the current `FT_ColorStop` object from `FT_ColorStopIterator`. Also increment the iterator. * src/sfnt/ttcolr.h: Updated.

diff --git a/ChangeLog b/ChangeLog
index a33c1e2..5b3ee82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2020-12-16  Dominik Röttsches  <drott@chromium.org>
 
+	[sfnt] Add 'COLR' v1 API to iterate color stops (#59703).
+
+	* src/sfnt/ttcolr.c (tt_face_get_colorline_stops): New function to
+	return the current `FT_ColorStop` object from `FT_ColorStopIterator`.
+	Also increment the iterator.
+
+	* src/sfnt/ttcolr.h: Updated.
+
+2020-12-16  Dominik Röttsches  <drott@chromium.org>
+
 	[sfnt] Add API to get actual paint from `FT_OpaquePaint` (#59703).
 
 	* src/sfnt/ttcolr.c (tt_face_get_paint): New function to resolve an
diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c
index 0d2b866..1e97d87 100644
--- a/src/sfnt/ttcolr.c
+++ b/src/sfnt/ttcolr.c
@@ -693,6 +693,44 @@
   }
 
 
+  FT_LOCAL_DEF ( FT_Bool )
+  tt_face_get_colorline_stops( TT_Face                face,
+                               FT_ColorStop*          color_stop,
+                               FT_ColorStopIterator  *iterator )
+  {
+    Colr*  colr = (Colr*)face->colr;
+
+    FT_Byte*  p;
+
+
+    if ( iterator->current_color_stop >= iterator->num_color_stops )
+      return 0;
+
+    if ( iterator->p +
+           ( ( iterator->num_color_stops - iterator->current_color_stop ) *
+             COLOR_STOP_SIZE ) >
+         ( (FT_Byte *)colr->table + colr->table_size ) )
+      return 0;
+
+    /* Iterator points at first `ColorStop` of `ColorLine`. */
+    p = iterator->p;
+
+    /* skip VarIdx entries */
+    color_stop->stop_offset = FT_NEXT_USHORT ( p );
+    FT_NEXT_ULONG ( p );
+
+    color_stop->color.palette_index = FT_NEXT_USHORT ( p );
+
+    color_stop->color.alpha = FT_NEXT_USHORT ( p );
+    FT_NEXT_ULONG ( p );
+
+    iterator->p = p;
+    iterator->current_color_stop++;
+
+    return 1;
+  }
+
+
   FT_LOCAL_DEF( FT_Bool )
   tt_face_get_paint( TT_Face         face,
                      FT_OpaquePaint  opaque_paint,
diff --git a/src/sfnt/ttcolr.h b/src/sfnt/ttcolr.h
index cdae3fa..77690f6 100644
--- a/src/sfnt/ttcolr.h
+++ b/src/sfnt/ttcolr.h
@@ -48,6 +48,11 @@ FT_BEGIN_HEADER
                                 FT_OpaquePaint*  paint );
 
   FT_LOCAL( FT_Bool )
+  tt_face_get_colorline_stops( TT_Face                face,
+                               FT_ColorStop*          color_stop,
+                               FT_ColorStopIterator*  iterator );
+
+  FT_LOCAL( FT_Bool )
   tt_face_get_paint( TT_Face         face,
                      FT_OpaquePaint  opaque_paint,
                      FT_COLR_Paint*  paint );