[sfnt] Register 'COLR' v1 API in driver (#59703).

* include/freetype/internal/sfnt.h (TT_Get_Color_Glyph_Paint_Func,
TT_Get_Paint_Layers_Func, TT_Get_Colorline_Stops_Func,
TT_Get_Paint_Func): New function pointer types.
(SFNT_Interface): Add them.
(FT_DEFINE_SFNT_INTERFACE): Updated.

* src/sfnt/sfdriver.c (PUT_COLOR_LAYERS_V1): New macro.
(sfnt_interface): Add new function pointers.
This commit is contained in:
Dominik Röttsches 2020-12-16 17:12:30 +02:00 committed by Werner Lemberg
parent 6260b4901c
commit d3e95d97a0
3 changed files with 200 additions and 38 deletions

View File

@ -1,3 +1,16 @@
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,
TT_Get_Paint_Layers_Func, TT_Get_Colorline_Stops_Func,
TT_Get_Paint_Func): New function pointer types.
(SFNT_Interface): Add them.
(FT_DEFINE_SFNT_INTERFACE): Updated.
* src/sfnt/sfdriver.c (PUT_COLOR_LAYERS_V1): New macro.
(sfnt_interface): Add new function pointers.
2020-12-16 Dominik Röttsches <drott@chromium.org>
[sfnt] Add 'COLR' v1 API to retrieve color layers (#59703).

View File

@ -524,6 +524,131 @@ FT_BEGIN_HEADER
FT_LayerIterator* iterator );
/**************************************************************************
*
* @functype:
* TT_Get_Color_Glyph_Paint_Func
*
* @description:
* Find the root @FT_OpaquePaint object for a given glyph ID.
*
* @input:
* face ::
* The target face object.
*
* base_glyph ::
* The glyph index the colored glyph layers are associated with.
*
* @output:
* paint ::
* The root @FT_OpaquePaint object.
*
* @return:
* Value~1 if everything is OK. If no color glyph is found, or the root
* paint could not be retrieved, value~0 gets returned. In case of an
* error, value~0 is returned also.
*/
typedef FT_Bool
( *TT_Get_Color_Glyph_Paint_Func )( TT_Face face,
FT_UInt base_glyph,
FT_OpaquePaint *paint );
/**************************************************************************
*
* @functype:
* TT_Get_Paint_Layers_Func
*
* @description:
* Access the layers of a `PaintColrLayers` table.
*
* @input:
* face ::
* The target face object.
*
* @inout:
* iterator ::
* The @FT_LayerIterator from an @FT_PaintColrLayers object, for which
* the layers are to be retrieved. The internal state of the iterator
* is incremented after one call to this function for retrieving one
* layer.
*
* @output:
* paint ::
* The root @FT_OpaquePaint object referencing the actual paint table.
*
* @return:
* Value~1 if everything is OK. Value~0 gets returned when the paint
* object can not be retrieved or any other error occurs.
*/
typedef FT_Bool
( *TT_Get_Paint_Layers_Func )( TT_Face face,
FT_LayerIterator* iterator,
FT_OpaquePaint *paint );
/**************************************************************************
*
* @functype:
* TT_Get_Colorline_Stops_Func
*
* @description:
* Get the gradient and solid fill information for a given glyph.
*
* @input:
* face ::
* The target face object.
*
* @inout:
* iterator ::
* An @FT_ColorStopIterator object. For the first call you should set
* `iterator->p` to `NULL`. For all following calls, simply use the
* same object again.
*
* @output:
* color_stop ::
* Color index and alpha value for the retrieved color stop.
*
* @return:
* Value~1 if everything is OK. If there are no more color stops,
* value~0 gets returned. In case of an error, value~0 is returned
* also.
*/
typedef FT_Bool
( *TT_Get_Colorline_Stops_Func )( TT_Face face,
FT_ColorStop *color_stop,
FT_ColorStopIterator* iterator );
/**************************************************************************
*
* @functype:
* TT_Get_Paint_Func
*
* @description:
* Get the paint details for a given @FT_OpaquePaint object.
*
* @input:
* face ::
* The target face object.
*
* opaque_paint ::
* The @FT_OpaquePaint object.
*
* @output:
* paint ::
* An @FT_COLR_Paint object holding the details on `opaque_paint`.
*
* @return:
* Value~1 if everything is OK. Value~0 if no details can be found for
* this paint or any other error occured.
*/
typedef FT_Bool
( *TT_Get_Paint_Func )( TT_Face face,
FT_OpaquePaint opaque_paint,
FT_COLR_Paint *paint );
/**************************************************************************
*
* @functype:
@ -709,73 +834,77 @@ FT_BEGIN_HEADER
*/
typedef struct SFNT_Interface_
{
TT_Loader_GotoTableFunc goto_table;
TT_Loader_GotoTableFunc goto_table;
TT_Init_Face_Func init_face;
TT_Load_Face_Func load_face;
TT_Done_Face_Func done_face;
FT_Module_Requester get_interface;
TT_Init_Face_Func init_face;
TT_Load_Face_Func load_face;
TT_Done_Face_Func done_face;
FT_Module_Requester get_interface;
TT_Load_Any_Func load_any;
TT_Load_Any_Func load_any;
/* these functions are called by `load_face' but they can also */
/* be called from external modules, if there is a need to do so */
TT_Load_Table_Func load_head;
TT_Load_Metrics_Func load_hhea;
TT_Load_Table_Func load_cmap;
TT_Load_Table_Func load_maxp;
TT_Load_Table_Func load_os2;
TT_Load_Table_Func load_post;
TT_Load_Table_Func load_head;
TT_Load_Metrics_Func load_hhea;
TT_Load_Table_Func load_cmap;
TT_Load_Table_Func load_maxp;
TT_Load_Table_Func load_os2;
TT_Load_Table_Func load_post;
TT_Load_Table_Func load_name;
TT_Free_Table_Func free_name;
TT_Load_Table_Func load_name;
TT_Free_Table_Func free_name;
/* this field was called `load_kerning' up to version 2.1.10 */
TT_Load_Table_Func load_kern;
TT_Load_Table_Func load_kern;
TT_Load_Table_Func load_gasp;
TT_Load_Table_Func load_pclt;
TT_Load_Table_Func load_gasp;
TT_Load_Table_Func load_pclt;
/* see `ttload.h'; this field was called `load_bitmap_header' up to */
/* version 2.1.10 */
TT_Load_Table_Func load_bhed;
TT_Load_Table_Func load_bhed;
TT_Load_SBit_Image_Func load_sbit_image;
TT_Load_SBit_Image_Func load_sbit_image;
/* see `ttpost.h' */
TT_Get_PS_Name_Func get_psname;
TT_Free_Table_Func free_psnames;
TT_Get_PS_Name_Func get_psname;
TT_Free_Table_Func free_psnames;
/* starting here, the structure differs from version 2.1.7 */
/* this field was introduced in version 2.1.8, named `get_psname' */
TT_Face_GetKerningFunc get_kerning;
TT_Face_GetKerningFunc get_kerning;
/* new elements introduced after version 2.1.10 */
/* load the font directory, i.e., the offset table and */
/* the table directory */
TT_Load_Table_Func load_font_dir;
TT_Load_Metrics_Func load_hmtx;
TT_Load_Table_Func load_font_dir;
TT_Load_Metrics_Func load_hmtx;
TT_Load_Table_Func load_eblc;
TT_Free_Table_Func free_eblc;
TT_Load_Table_Func load_eblc;
TT_Free_Table_Func free_eblc;
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_Get_Colr_Layer_Func get_colr_layer;
TT_Blend_Colr_Func colr_blend;
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_Get_Colr_Layer_Func get_colr_layer;
TT_Get_Color_Glyph_Paint_Func get_colr_glyph_paint;
TT_Get_Paint_Layers_Func get_paint_layers;
TT_Get_Colorline_Stops_Func get_colorline_stops;
TT_Get_Paint_Func get_paint;
TT_Blend_Colr_Func colr_blend;
TT_Get_Metrics_Func get_metrics;
TT_Get_Metrics_Func get_metrics;
TT_Get_Name_Func get_name;
TT_Get_Name_ID_Func get_name_id;
TT_Get_Name_Func get_name;
TT_Get_Name_ID_Func get_name_id;
} SFNT_Interface;
@ -820,6 +949,10 @@ FT_BEGIN_HEADER
free_colr_, \
set_palette_, \
get_colr_layer_, \
get_colr_glyph_paint_, \
get_paint_layers_, \
get_colorline_stops_, \
get_paint_, \
colr_blend_, \
get_metrics_, \
get_name_, \
@ -860,6 +993,10 @@ FT_BEGIN_HEADER
free_colr_, \
set_palette_, \
get_colr_layer_, \
get_colr_glyph_paint_, \
get_paint_layers_, \
get_colorline_stops_, \
get_paint_, \
colr_blend_, \
get_metrics_, \
get_name_, \

View File

@ -1213,6 +1213,8 @@
#define PUT_COLOR_LAYERS( a ) NULL
#endif
#define PUT_COLOR_LAYERS_V1( a ) PUT_COLOR_LAYERS( a )
#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
#define PUT_PS_NAMES( a ) a
#else
@ -1271,9 +1273,9 @@
/* TT_Free_Table_Func free_eblc */
PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ),
/* TT_Set_SBit_Strike_Func set_sbit_strike */
/* TT_Set_SBit_Strike_Func set_sbit_strike */
PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
/* TT_Load_Strike_Metrics_Func load_strike_metrics */
/* TT_Load_Strike_Metrics_Func load_strike_metrics */
PUT_COLOR_LAYERS( tt_face_load_cpal ),
/* TT_Load_Table_Func load_cpal */
@ -1287,6 +1289,16 @@
/* TT_Set_Palette_Func set_palette */
PUT_COLOR_LAYERS( tt_face_get_colr_layer ),
/* TT_Get_Colr_Layer_Func get_colr_layer */
PUT_COLOR_LAYERS_V1( tt_face_get_colr_glyph_paint ),
/* TT_Get_Colr_Glyph_Paint_Func get_colr_glyph_paint */
PUT_COLOR_LAYERS_V1( tt_face_get_paint_layers ),
/* TT_Get_Paint_Layers_Func get_paint_layers */
PUT_COLOR_LAYERS_V1( tt_face_get_colorline_stops ),
/* TT_Get_Paint get_paint */
PUT_COLOR_LAYERS_V1( tt_face_get_paint ),
/* TT_Get_Colorline_Stops_Func get_colorline_stops */
PUT_COLOR_LAYERS( tt_face_colr_blend_layer ),
/* TT_Blend_Colr_Func colr_blend */