[autofit] Use string of standard characters.

This is more flexible; additionally, it would allow character
clusters.

* src/autofit/aftypes.h (SCRIPT, AF_DEFINE_SCRIPT_CLASS): Updated.
(AF_ScriptClassRec): Replace `standard_char[123]' with
`standard_charstring'.

* src/autofit/afscript.h: Replace last three character arguments
of the `SCRIPT' calls with a string parameter, holding the standard
characters (in UTF-8 encoding) separated with spaces.

* src/autofit/afglobal.c, src/autofit/afglobal.h,
src/autofit/afpic.c, src/autofit/afranges.c, src/autofit/hbshim.c
(SCRIPT): Updated.

* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
src/autofit/aflatin.c (af_latin_metrics_init_widths): Updated.
This commit is contained in:
Werner Lemberg 2015-12-06 09:58:18 +01:00
parent a8a54c3060
commit f45c0bf963
10 changed files with 113 additions and 121 deletions

View File

@ -1,3 +1,25 @@
2015-12-06 Werner Lemberg <wl@gnu.org>
[autofit] Use string of standard characters.
This is more flexible; additionally, it would allow character
clusters.
* src/autofit/aftypes.h (SCRIPT, AF_DEFINE_SCRIPT_CLASS): Updated.
(AF_ScriptClassRec): Replace `standard_char[123]' with
`standard_charstring'.
* src/autofit/afscript.h: Replace last three character arguments
of the `SCRIPT' calls with a string parameter, holding the standard
characters (in UTF-8 encoding) separated with spaces.
* src/autofit/afglobal.c, src/autofit/afglobal.h,
src/autofit/afpic.c, src/autofit/afranges.c, src/autofit/hbshim.c
(SCRIPT): Updated.
* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
src/autofit/aflatin.c (af_latin_metrics_init_widths): Updated.
2015-12-05 Werner Lemberg <wl@gnu.org>
* src/autofit/afblue.dat: Separate blue zone characters with spaces.
@ -425,7 +447,7 @@
(PFR_CHECK_SIZE): ... this.
(PFR_SIZE): [!PFR_CONFIG_NO_CHECKS]: Define to PFR_CHECK_SIZE.
* src/pfr/pfrload.c (pfr_log_font_count): Check `count'.
* src/pfr/pfrload.c (pfr_log_font_count): Check `count'.
(pfr_extra_item_load_kerning_pairs): Remove tracing message.
(pfr_phy_font_load): Use PFR_CHECK_SIZE where appropriate.
Allocate `chars' after doing a size checks.
@ -1017,7 +1039,7 @@
* src/autofit/afstyles.h: Add Lao data.
2015-09-27 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
[base] Fix a leak by broken sfnt-PS or resource fork (#46028).
open_face_from_buffer() frees passed buffer if valid font

View File

@ -101,45 +101,36 @@
AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET
[style_class->script];
FT_UInt32 standard_char;
const char* p;
FT_ULong ch;
standard_char = script_class->standard_char1;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
p = script_class->standard_charstring;
/* We check a list of standard characters. The first match wins. */
glyph_index = 0;
while ( *p )
{
if ( script_class->standard_char2 )
{
standard_char = script_class->standard_char2;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
{
if ( script_class->standard_char3 )
{
standard_char = script_class->standard_char3;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
goto Exit;
}
else
goto Exit;
}
}
else
goto Exit;
while ( *p == ' ' )
p++;
GET_UTF8_CHAR( ch, p );
af_get_char_index( &metrics->root,
ch,
&glyph_index,
&y_offset );
if ( glyph_index )
break;
}
if ( !glyph_index )
goto Exit;
FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n",
standard_char, glyph_index ));
ch, glyph_index ));
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
if ( error || face->glyph->outline.n_points <= 0 )

View File

@ -42,13 +42,13 @@
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
AF_DEFINE_SCRIPT_CLASS( \
af_ ## s ## _script_class, \
AF_SCRIPT_ ## S, \
af_ ## s ## _uniranges, \
af_ ## s ## _nonbase_uniranges, \
sc1, sc2, sc3 )
ss )
#include "afscript.h"
@ -83,7 +83,7 @@
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
&af_ ## s ## _script_class,
FT_LOCAL_ARRAY_DEF( AF_ScriptClass )

View File

@ -34,7 +34,7 @@ FT_BEGIN_HEADER
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class )
#include "afscript.h"

View File

@ -92,52 +92,41 @@
AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET
[style_class->script];
FT_UInt32 standard_char;
const char* p;
FT_ULong ch;
p = script_class->standard_charstring;
/*
* We check more than a single standard character to catch features
* like `c2sc' (small caps from caps) that don't contain lowercase
* letters by definition, or other features that mainly operate on
* numerals.
* We check a list of standard characters to catch features like
* `c2sc' (small caps from caps) that don't contain lowercase letters
* by definition, or other features that mainly operate on numerals.
* The first match wins.
*/
standard_char = script_class->standard_char1;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
glyph_index = 0;
while ( *p )
{
if ( script_class->standard_char2 )
{
standard_char = script_class->standard_char2;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
{
if ( script_class->standard_char3 )
{
standard_char = script_class->standard_char3;
af_get_char_index( &metrics->root,
standard_char,
&glyph_index,
&y_offset );
if ( !glyph_index )
goto Exit;
}
else
goto Exit;
}
}
else
goto Exit;
while ( *p == ' ' )
p++;
GET_UTF8_CHAR( ch, p );
af_get_char_index( &metrics->root,
ch,
&glyph_index,
&y_offset );
if ( glyph_index )
break;
}
if ( !glyph_index )
goto Exit;
FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n",
standard_char, glyph_index ));
ch, glyph_index ));
error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
if ( error || face->glyph->outline.n_points <= 0 )

View File

@ -122,7 +122,7 @@
#include "afwrtsys.h"
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, sss ) \
FT_Init_Class_af_ ## s ## _script_class( \
&container->af_script_classes_rec[ss++] );

View File

@ -26,13 +26,13 @@
FT_BEGIN_HEADER
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
extern const AF_Script_UniRangeRec af_ ## s ## _uniranges[];
#include "afscript.h"
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
extern const AF_Script_UniRangeRec af_ ## s ## _nonbase_uniranges[];
#include "afscript.h"

View File

@ -33,126 +33,126 @@
SCRIPT( arab, ARAB,
"Arabic",
HB_SCRIPT_ARABIC,
0x644, 0x62D, 0x640 ) /* ل ح ـ */
"\xD9\x84 \xD8\xAD \xD9\x80" ) /* ل ح ـ */
SCRIPT( cyrl, CYRL,
"Cyrillic",
HB_SCRIPT_CYRILLIC,
0x43E, 0x41E, 0x0 ) /* о О */
"\xD0\xBE \xD0\x9E" ) /* о О */
SCRIPT( deva, DEVA,
"Devanagari",
HB_SCRIPT_DEVANAGARI,
0x920, 0x935, 0x91F ) /* ठ व ट */
"\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठ व ट */
SCRIPT( grek, GREK,
"Greek",
HB_SCRIPT_GREEK,
0x3BF, 0x39F, 0x0 ) /* ο Ο */
"\xCE\xBF \xCE\x9F" ) /* ο Ο */
SCRIPT( hebr, HEBR,
"Hebrew",
HB_SCRIPT_HEBREW,
0x5DD, 0x0, 0x0 ) /* ם */
"\xD7\x9D" ) /* ם */
/* only digit zero has a simple shape in the Lao script */
SCRIPT( lao, LAO,
"Lao",
HB_SCRIPT_LAO,
0xED0, 0x0, 0x0 ) /* */
"\xE0\xBB\x90" ) /* */
SCRIPT( latn, LATN,
"Latin",
HB_SCRIPT_LATIN,
'o', 'O', '0' )
"o O 0" )
SCRIPT( latb, LATB,
"Latin Subscript Fallback",
HB_SCRIPT_INVALID,
0x2092, 0x2080, 0x0 ) /* ₒ ₀ */
"\xE2\x82\x92 \xE2\x82\x80" ) /* ₒ ₀ */
SCRIPT( latp, LATP,
"Latin Superscript Fallback",
HB_SCRIPT_INVALID,
0x1D52, 0x1D3C, 0x2070 ) /* ᵒ ᴼ ⁰ */
"\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* ᵒ ᴼ ⁰ */
SCRIPT( none, NONE,
"no script",
HB_SCRIPT_INVALID,
0x0, 0x0, 0x0 )
NULL )
/* there are no simple forms for letters; we thus use two digit shapes */
SCRIPT( telu, TELU,
"Telugu",
HB_SCRIPT_TELUGU,
0xC66, 0xC67, 0x0 ) /* ౧ */
"\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౧ */
SCRIPT( thai, THAI,
"Thai",
HB_SCRIPT_THAI,
0xE32, 0xE45, 0xE50 ) /* า ๅ */
"\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ */
#ifdef AF_CONFIG_OPTION_INDIC
SCRIPT( beng, BENG,
"Bengali",
HB_SCRIPT_BENGALI,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( gujr, GUJR,
"Gujarati",
HB_SCRIPT_GUJARATI,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( guru, GURU,
"Gurmukhi",
HB_SCRIPT_GURMUKHI,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( knda, KNDA,
"Kannada",
HB_SCRIPT_KANNADA,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( limb, LIMB,
"Limbu",
HB_SCRIPT_LIMBU,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( mlym, MLYM,
"Malayalam",
HB_SCRIPT_MALAYALAM,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( orya, ORYA,
"Oriya",
HB_SCRIPT_ORIYA,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( sinh, SINH,
"Sinhala",
HB_SCRIPT_SINHALA,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( sund, SUND,
"Sundanese",
HB_SCRIPT_SUNDANESE,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( sylo, SYLO,
"Syloti Nagri",
HB_SCRIPT_SYLOTI_NAGRI,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( taml, TAML,
"Tamil",
HB_SCRIPT_TAMIL,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
SCRIPT( tibt, TIBT,
"Tibetan",
HB_SCRIPT_TIBETAN,
'o', 0x0, 0x0 ) /* XXX */
"o" ) /* XXX */
#endif /* AF_CONFIG_OPTION_INDIC */
@ -161,7 +161,7 @@
SCRIPT( hani, HANI,
"CJKV ideographs",
HB_SCRIPT_HAN,
0x7530, 0x56D7, 0x0 ) /* 田囗 */
"\xE7\x94\xB0 \xE5\x9B\x97" ) /* 田 囗 */
#endif /* AF_CONFIG_OPTION_CJK */

View File

@ -309,7 +309,7 @@ extern void* _af_debug_hints;
*/
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
#define SCRIPT( s, S, d, h, ss ) \
AF_SCRIPT_ ## S,
/* The list of known scripts. */
@ -343,9 +343,7 @@ extern void* _af_debug_hints;
AF_Script_UniRange script_uni_ranges;
AF_Script_UniRange script_uni_nonbase_ranges;
FT_UInt32 standard_char1; /* for default width and height */
FT_UInt32 standard_char2; /* ditto */
FT_UInt32 standard_char3; /* ditto */
const char* standard_charstring; /* for default width and height */
} AF_ScriptClassRec;
@ -524,18 +522,14 @@ extern void* _af_debug_hints;
script, \
ranges, \
nonbase_ranges, \
std_char1, \
std_char2, \
std_char3 ) \
std_charstring ) \
FT_CALLBACK_TABLE_DEF \
const AF_ScriptClassRec script_class = \
{ \
script, \
ranges, \
nonbase_ranges, \
std_char1, \
std_char2, \
std_char3 \
std_charstring, \
};
@ -601,18 +595,14 @@ extern void* _af_debug_hints;
script_, \
ranges, \
nonbase_ranges, \
std_char1, \
std_char2, \
std_char3 ) \
std_charstring ) \
FT_LOCAL_DEF( void ) \
FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \
{ \
ac->script = script_; \
ac->script_uni_ranges = ranges; \
ac->script_uni_nonbase_ranges = nonbase_ranges; \
ac->standard_char1 = std_char1; \
ac->standard_char2 = std_char2; \
ac->standard_char3 = std_char3; \
ac->standard_charstring = std_charstring; \
}

View File

@ -86,7 +86,7 @@
/* load HarfBuzz script tags */
#undef SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) h,
#define SCRIPT( s, S, d, h, ss ) h,
static const hb_script_t scripts[] =