diff --git a/ChangeLog b/ChangeLog index 604d3e576..c12b068f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2018-06-12 Werner Lemberg + + 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 Finish CPAL/COLR support (2/4). diff --git a/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h index 7270d1208..aac8e9b7f 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 26f6569da..acde08be5 100644 --- a/src/base/ftcolor.c +++ b/src/base/ftcolor.c @@ -18,6 +18,7 @@ #include #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 */