[autofit] More coverage fixes for complex scripts.
* src/autofit/hbshim.c (af_get_coverage): Merge input glyph coverage of GSUB lookups into output coverage. Otherwise, ligatures are not handled properly. Don't check blue zone characters for default coverage.
This commit is contained in:
parent
bbd8313b5d
commit
8c7fb78b16
|
@ -1,3 +1,12 @@
|
||||||
|
2014-04-17 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
[autofit] More coverage fixes for complex scripts.
|
||||||
|
|
||||||
|
* src/autofit/hbshim.c (af_get_coverage): Merge input glyph coverage
|
||||||
|
of GSUB lookups into output coverage. Otherwise, ligatures are not
|
||||||
|
handled properly.
|
||||||
|
Don't check blue zone characters for default coverage.
|
||||||
|
|
||||||
2014-04-17 Werner Lemberg <wl@gnu.org>
|
2014-04-17 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
Make `FT_Get_SubGlyph_Info' actually work.
|
Make `FT_Get_SubGlyph_Info' actually work.
|
||||||
|
|
|
@ -103,7 +103,9 @@
|
||||||
hb_face_t* face;
|
hb_face_t* face;
|
||||||
|
|
||||||
hb_set_t* gsub_lookups; /* GSUB lookups for a given script */
|
hb_set_t* gsub_lookups; /* GSUB lookups for a given script */
|
||||||
hb_set_t* gsub_glyphs; /* glyphs covered by GSUB lookups */
|
hb_set_t* gsub_glyphs_in; /* glyphs covered by GSUB lookups */
|
||||||
|
hb_set_t* gsub_glyphs_out;
|
||||||
|
|
||||||
hb_set_t* gpos_lookups; /* GPOS lookups for a given script */
|
hb_set_t* gpos_lookups; /* GPOS lookups for a given script */
|
||||||
hb_set_t* gpos_glyphs; /* glyphs covered by GPOS lookups */
|
hb_set_t* gpos_glyphs; /* glyphs covered by GPOS lookups */
|
||||||
|
|
||||||
|
@ -126,7 +128,8 @@
|
||||||
face = hb_font_get_face( globals->hb_font );
|
face = hb_font_get_face( globals->hb_font );
|
||||||
|
|
||||||
gsub_lookups = hb_set_create();
|
gsub_lookups = hb_set_create();
|
||||||
gsub_glyphs = hb_set_create();
|
gsub_glyphs_in = hb_set_create();
|
||||||
|
gsub_glyphs_out = hb_set_create();
|
||||||
gpos_lookups = hb_set_create();
|
gpos_lookups = hb_set_create();
|
||||||
gpos_glyphs = hb_set_create();
|
gpos_glyphs = hb_set_create();
|
||||||
|
|
||||||
|
@ -199,9 +202,9 @@
|
||||||
HB_OT_TAG_GSUB,
|
HB_OT_TAG_GSUB,
|
||||||
idx,
|
idx,
|
||||||
NULL,
|
NULL,
|
||||||
|
gsub_glyphs_in,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
gsub_glyphs_out );
|
||||||
gsub_glyphs );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||||
|
@ -247,6 +250,7 @@
|
||||||
* (this is, not a single character is covered), we skip this coverage.
|
* (this is, not a single character is covered), we skip this coverage.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
if ( style_class->coverage != AF_COVERAGE_DEFAULT )
|
||||||
{
|
{
|
||||||
AF_Blue_Stringset bss = style_class->blue_stringset;
|
AF_Blue_Stringset bss = style_class->blue_stringset;
|
||||||
const AF_Blue_StringRec* bs = &af_blue_stringsets[bss];
|
const AF_Blue_StringRec* bs = &af_blue_stringsets[bss];
|
||||||
|
@ -288,6 +292,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* merge in and out glyphs */
|
||||||
|
hb_set_union( gsub_glyphs_out, gsub_glyphs_in );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Various OpenType features might use the same glyphs at different
|
* Various OpenType features might use the same glyphs at different
|
||||||
* vertical positions; for example, superscript and subscript glyphs
|
* vertical positions; for example, superscript and subscript glyphs
|
||||||
|
@ -336,14 +343,14 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
if ( style_class->coverage != AF_COVERAGE_DEFAULT )
|
if ( style_class->coverage != AF_COVERAGE_DEFAULT )
|
||||||
hb_set_subtract( gsub_glyphs, gpos_glyphs );
|
hb_set_subtract( gsub_glyphs_out, gpos_glyphs );
|
||||||
|
|
||||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||||
FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" ));
|
FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" ));
|
||||||
count = 0;
|
count = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for ( idx = -1; hb_set_next( gsub_glyphs, &idx ); )
|
for ( idx = -1; hb_set_next( gsub_glyphs_out, &idx ); )
|
||||||
{
|
{
|
||||||
#ifdef FT_DEBUG_LEVEL_TRACE
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
||||||
if ( !( count % 10 ) )
|
if ( !( count % 10 ) )
|
||||||
|
@ -376,7 +383,8 @@
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
hb_set_destroy( gsub_lookups );
|
hb_set_destroy( gsub_lookups );
|
||||||
hb_set_destroy( gsub_glyphs );
|
hb_set_destroy( gsub_glyphs_in );
|
||||||
|
hb_set_destroy( gsub_glyphs_out );
|
||||||
hb_set_destroy( gpos_lookups );
|
hb_set_destroy( gpos_lookups );
|
||||||
hb_set_destroy( gpos_glyphs );
|
hb_set_destroy( gpos_glyphs );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue