[truetype] Disallow bitmap strokes for non-default instances.

Also speed up access of default instances if GX variations are
active.

* include/freetype/internal/tttypes.h (TT_FaceRec): Add
`is_default_instance' member.

* src/sfnt/sfobjs.c (sfnt_init_face): Initialize
`is_default_instance'.

* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
load_truetype_glyph): Add test for default instance.
(TT_Load_Glyph): Load embedded bitmaps for default instance only.

* src/truetype/ttgxvar.c (TT_Set_MM_Blend): Compute
`is_default_instance'.
This commit is contained in:
Werner Lemberg 2016-09-29 19:49:07 +02:00
parent bf90239ca5
commit 2067c6985a
5 changed files with 42 additions and 8 deletions

View File

@ -1,3 +1,23 @@
2016-09-29 Werner Lemberg <wl@gnu.org>
[truetype] Disallow bitmap strokes for non-default instances.
Also speed up access of default instances if GX variations are
active.
* include/freetype/internal/tttypes.h (TT_FaceRec): Add
`is_default_instance' member.
* src/sfnt/sfobjs.c (sfnt_init_face): Initialize
`is_default_instance'.
* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
load_truetype_glyph): Add test for default instance.
(TT_Load_Glyph): Load embedded bitmaps for default instance only.
* src/truetype/ttgxvar.c (TT_Set_MM_Blend): Compute
`is_default_instance'.
2016-09-29 Werner Lemberg <wl@gnu.org>
[truetype] Clean up `TT_Face' structure.

View File

@ -1302,6 +1302,10 @@ FT_BEGIN_HEADER
/* */
/* ebdt_size :: The size of the sbit data table. */
/* */
/* is_default_instance :: Set if the glyph outlines can be used */
/* unmodified (i.e., without applying glyph */
/* variation deltas). */
/* */
typedef struct TT_FaceRec_
{
FT_FaceRec root;
@ -1455,6 +1459,9 @@ FT_BEGIN_HEADER
FT_ULong ebdt_size;
#endif
/* since 2.7.1 */
FT_Bool is_default_instance;
} TT_FaceRec;

View File

@ -901,6 +901,8 @@
if ( error )
return error;
face->is_default_instance = 1;
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
{
FT_ULong fvar_len;

View File

@ -886,7 +886,7 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
if ( loader->face->doblend )
if ( loader->face->doblend && !loader->face->is_default_instance )
{
/* Deltas apply to the unscaled data. */
error = TT_Vary_Apply_Glyph_Deltas( loader->face,
@ -1564,7 +1564,7 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
if ( loader->face->doblend )
if ( loader->face->doblend && !loader->face->is_default_instance )
{
/* a small outline structure with four elements for */
/* communication with `TT_Vary_Apply_Glyph_Deltas' */
@ -1727,7 +1727,7 @@
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
if ( face->doblend )
if ( face->doblend && !face->is_default_instance )
{
short i, limit;
FT_SubGlyph subglyph;
@ -2566,18 +2566,17 @@
{
FT_Error error;
TT_LoaderRec loader;
TT_Face face = (TT_Face)glyph->face;
FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/* try to load embedded bitmap if any */
/* */
/* XXX: The convention should be emphasized in */
/* the documents because it can be confusing. */
/* try to load embedded bitmap (if any) */
if ( size->strike_index != 0xFFFFFFFFUL &&
( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
( load_flags & FT_LOAD_NO_BITMAP ) == 0 &&
face->is_default_instance )
{
error = load_sbit_image( size, glyph, glyph_index, load_flags );
if ( !error )

View File

@ -1051,6 +1051,7 @@
GX_Blend blend;
FT_MM_Var* mmvar;
FT_UInt i;
FT_Bool is_default_instance = 1;
FT_Memory memory = face->root.memory;
enum
@ -1093,6 +1094,9 @@
error = FT_THROW( Invalid_Argument );
goto Exit;
}
if ( coords[i] != 0 )
is_default_instance = 0;
}
FT_TRACE5(( "\n" ));
@ -1172,6 +1176,8 @@
}
}
face->is_default_instance = is_default_instance;
Exit:
return error;
}