Add `FT_PARAM_TAG_IGNORE_SBIX`.

This is another bit to handle 'sbix' tables as described in the OpenType
specification.

* include/freetype/ftparams.h (FT_PARAM_TAG_IGNORE_SBIX): New macro.

* src/sfnt/sfobjc.c (is_apple_sbix): Rename to...
(has_sbix): ... this.
Check for more sbit tables.
Handle `FT_PARAM_TAG_IGNORE_SBIX` to eventually control `has_sbix`.
Only call sbit table loader if an sbit table is present.
This commit is contained in:
Werner Lemberg 2022-03-19 18:51:34 +01:00
parent ac4c1ebf7e
commit 1949a7ec3a
2 changed files with 50 additions and 17 deletions

View File

@ -112,6 +112,21 @@ FT_BEGIN_HEADER
FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
/**************************************************************************
*
* @enum:
* FT_PARAM_TAG_IGNORE_SBIX
*
* @description:
* A tag for @FT_Parameter to make @FT_Open_Face ignore an 'sbix' table
* while loading a font. Use this if @FT_FACE_FLAG_SBIX is set and you
* want to access the outline glyphs in the font.
*
*/
#define FT_PARAM_TAG_IGNORE_SBIX \
FT_MAKE_TAG( 'i', 's', 'b', 'x' )
/**************************************************************************
*
* @enum:

View File

@ -784,17 +784,23 @@
FT_Int num_params,
FT_Parameter* params )
{
FT_Error error;
FT_Error error;
#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
FT_Error psnames_error;
FT_Error psnames_error;
#endif
FT_Bool has_outline;
FT_Bool is_apple_sbit;
FT_Bool is_apple_sbix;
FT_Bool has_CBLC;
FT_Bool has_CBDT;
FT_Bool ignore_typographic_family = FALSE;
FT_Bool ignore_typographic_subfamily = FALSE;
FT_Bool has_outline;
FT_Bool is_apple_sbit;
FT_Bool has_CBLC;
FT_Bool has_CBDT;
FT_Bool has_EBLC;
FT_Bool has_bloc;
FT_Bool has_sbix;
FT_Bool ignore_typographic_family = FALSE;
FT_Bool ignore_typographic_subfamily = FALSE;
FT_Bool ignore_sbix = FALSE;
SFNT_Service sfnt = (SFNT_Service)face->sfnt;
@ -813,6 +819,8 @@
ignore_typographic_family = TRUE;
else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY )
ignore_typographic_subfamily = TRUE;
else if ( params[i].tag == FT_PARAM_TAG_IGNORE_SBIX )
ignore_sbix = TRUE;
}
}
@ -848,8 +856,17 @@
tt_face_lookup_table( face, TTAG_CFF2 ) );
#endif
is_apple_sbit = 0;
is_apple_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 );
/* check which sbit formats are present */
has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 );
has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 );
has_EBLC = !face->goto_table( face, TTAG_EBLC, stream, 0 );
has_bloc = !face->goto_table( face, TTAG_bloc, stream, 0 );
has_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 );
is_apple_sbit = FALSE;
if ( ignore_sbix )
has_sbix = FALSE;
/* if this font doesn't contain outlines, we try to load */
/* a `bhed' table */
@ -861,16 +878,13 @@
/* load the font header (`head' table) if this isn't an Apple */
/* sbit font file */
if ( !is_apple_sbit || is_apple_sbix )
if ( !is_apple_sbit || has_sbix )
{
LOAD_( head );
if ( error )
goto Exit;
}
has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 );
has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 );
/* Ignore outlines for CBLC/CBDT fonts. */
if ( has_CBLC || has_CBDT )
has_outline = FALSE;
@ -980,7 +994,11 @@
/* the optional tables */
/* embedded bitmap support */
if ( sfnt->load_eblc )
/* TODO: Replace this clumsy check for all possible sbit tables */
/* with something better (for example, by passing a parameter */
/* to suppress 'sbix' loading). */
if ( sfnt->load_eblc &&
( has_CBLC || has_EBLC || has_bloc || has_sbix ) )
LOAD_( eblc );
/* colored glyph support */
@ -1055,7 +1073,7 @@
{
/* by default (and for backward compatibility) we handle */
/* fonts with an 'sbix' table as bitmap-only */
if ( is_apple_sbix )
if ( has_sbix )
flags |= FT_FACE_FLAG_SBIX; /* with 'sbix' bitmaps */
else
flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */