diff --git a/ChangeLog b/ChangeLog index a33c1e203..5b3ee82d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2020-12-16 Dominik Röttsches + + [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 [sfnt] Add API to get actual paint from `FT_OpaquePaint` (#59703). diff --git a/src/sfnt/ttcolr.c b/src/sfnt/ttcolr.c index 0d2b8661c..1e97d87cd 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 cdae3fab9..77690f668 100644 --- a/src/sfnt/ttcolr.h +++ b/src/sfnt/ttcolr.h @@ -47,6 +47,11 @@ FT_BEGIN_HEADER FT_UInt base_glyph, 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,