Merge branch 'master' into cff-subset

This commit is contained in:
Michiharu Ariza 2018-10-03 17:06:18 -07:00
commit 8be5a9186b
56 changed files with 1291 additions and 486 deletions

View File

@ -91,7 +91,7 @@ jobs:
- run: apt update || true - run: apt update || true
- run: apt install -y clang lld binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - run: apt install -y clang lld binutils libtool autoconf automake make pkg-config gtk-doc-tools ragel libfreetype6-dev libfontconfig1-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip
- run: pip install fonttools - run: pip install fonttools
- run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-double-promotion -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code -Wno-deprecated-declarations" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig - run: CFLAGS="-Weverything -Wno-reserved-id-macro -Wno-conversion -Wno-padded -Wno-sign-conversion -Wno-cast-qual -Wno-documentation -Wno-documentation-unknown-command" CXXFLAGS="-Weverything -Wno-old-style-cast -Wno-documentation -Wno-documentation-unknown-command -Wno-c++98-compat -Wno-cast-qual -Wno-c++98-compat-pedantic -Wno-sign-conversion -Wno-padded -Wno-shorten-64-to-32 -Wno-extra-semi -Wno-reserved-id-macro -Wno-float-conversion -Wno-format-pedantic -Wno-shadow -Wno-conversion -Wno-zero-as-null-pointer-constant -Wno-missing-field-initializers -Wno-used-but-marked-unused -Wno-unused-macros -Wno-comma -Wno-float-equal -Wno-disabled-macro-expansion -Wno-weak-vtables -Wno-unused-parameter -Wno-covered-switch-default -Wno-unreachable-code" CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 --with-fontconfig
- run: make -j32 CPPFLAGS="-Werror" - run: make -j32 CPPFLAGS="-Werror"
- run: make check CPPFLAGS="-Werror" || .ci/fail.sh - run: make check CPPFLAGS="-Werror" || .ci/fail.sh

View File

@ -47,8 +47,6 @@ matrix:
- os: osx - os: osx
compiler: clang compiler: clang
install: install:
# https://github.com/harfbuzz/harfbuzz/issues/345
- export CXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations"
- brew update; - brew update;
# Workaround Travis/brew bug # Workaround Travis/brew bug
- brew uninstall libtool && brew install libtool - brew uninstall libtool && brew install libtool

View File

@ -330,7 +330,7 @@ AC_ARG_WITH(graphite2,
[Use the graphite2 library @<:@default=no@:>@])],, [Use the graphite2 library @<:@default=no@:>@])],,
[with_graphite2=no]) [with_graphite2=no])
have_graphite2=false have_graphite2=false
GRAPHITE2_DEPS="graphite2" GRAPHITE2_DEPS="graphite2 >= 1.2.0"
AC_SUBST(GRAPHITE2_DEPS) AC_SUBST(GRAPHITE2_DEPS)
if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then
PKG_CHECK_MODULES(GRAPHITE2, $GRAPHITE2_DEPS, have_graphite2=true, :) PKG_CHECK_MODULES(GRAPHITE2, $GRAPHITE2_DEPS, have_graphite2=true, :)

View File

@ -289,13 +289,15 @@ harfbuzz-gobject.def: $(HB_GOBJECT_headers)
GENERATORS = \ GENERATORS = \
gen-arabic-table.py \ gen-arabic-table.py \
gen-indic-table.py \
gen-use-table.py \
gen-def.py \ gen-def.py \
gen-emoji-table.py \
gen-indic-table.py \
gen-os2-unicode-ranges.py \
gen-use-table.py \
$(NULL) $(NULL)
EXTRA_DIST += $(GENERATORS) EXTRA_DIST += $(GENERATORS)
unicode-tables: arabic-table indic-table use-table unicode-tables: arabic-table indic-table use-table emoji-table
arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \ $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \
@ -309,9 +311,13 @@ use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.tx
$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
|| ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
emoji-table: gen-emoji-table.py emoji-data.txt
$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
|| ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
built-sources: $(BUILT_SOURCES) built-sources: $(BUILT_SOURCES)
.PHONY: unicode-tables arabic-table indic-table use-table built-sources .PHONY: unicode-tables arabic-table indic-table use-table emoji-table built-sources
RAGEL_GENERATED = \ RAGEL_GENERATED = \
$(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \ $(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \

View File

@ -57,6 +57,7 @@ HB_BASE_sources = \
hb-static.cc \ hb-static.cc \
hb-string-array.hh \ hb-string-array.hh \
hb-unicode.hh \ hb-unicode.hh \
hb-unicode-emoji-table.hh \
hb-unicode.cc \ hb-unicode.cc \
hb-vector.hh \ hb-vector.hh \
hb-utf.hh \ hb-utf.hh \

View File

@ -146,7 +146,7 @@ static void colr_cpal_rendering (cairo_font_face_t *cairo_face, unsigned int upe
int r = (color >> 8) & 0xFF; int r = (color >> 8) & 0xFF;
int g = (color >> 16) & 0xFF; int g = (color >> 16) & 0xFF;
int b = (color >> 24) & 0xFF; int b = (color >> 24) & 0xFF;
cairo_set_source_rgba (cr, r / 255.f, g / 255.f, b / 255.f, alpha); cairo_set_source_rgba (cr, r / 255., g / 255., b / 255., alpha);
cairo_glyph_t glyph; cairo_glyph_t glyph;
glyph.index = glyph_id; glyph.index = glyph_id;

64
src/gen-emoji-table.py Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/python
from __future__ import print_function, division, absolute_import
import sys
import os.path
from collections import OrderedDict
if len (sys.argv) != 2:
print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr)
sys.exit (1)
f = open(sys.argv[1])
header = [f.readline () for _ in range(10)]
sets = OrderedDict()
for line in f.readlines():
line = line.strip()
if not line or line[0] == '#':
continue
rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]]
rang = [int(s, 16) for s in rang.split('..')]
if len(rang) > 1:
start, end = rang
else:
start = end = rang[0]
if typ not in sets:
sets[typ] = set()
sets[typ].add((start, end))
print ("/* == Start of generated table == */")
print ("/*")
print (" * The following tables are generated by running:")
print (" *")
print (" * ./gen-emoji-table.py emoji-data.txt")
print (" *")
print (" * on file with this header:")
print (" *")
for l in header:
print (" * %s" % (l.strip()))
print (" */")
print ()
print ("#ifndef HB_UNICODE_EMOJI_TABLE_HH")
print ("#define HB_UNICODE_EMOJI_TABLE_HH")
print ()
print ('#include "hb-unicode.hh"')
print ()
for typ,s in sets.items():
if typ != "Extended_Pictographic": continue
print()
print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ)
print("{")
for pair in sorted(s):
print(" {0x%04X, 0x%04X}," % pair)
print("};")
print ()
print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */")
print ()
print ("/* == End of generated table == */")

View File

@ -13,7 +13,7 @@ import sys
reload(sys) reload(sys)
sys.setdefaultencoding('utf-8') sys.setdefaultencoding('utf-8')
print ("""static Range os2UnicodeRangesSorted[] = print ("""static OS2Range _hb_os2_unicode_ranges[] =
{""") {""")
args = sys.argv[1:] args = sys.argv[1:]

View File

@ -197,7 +197,10 @@ def is_CONS_SUB(U, UISC, UGC):
def is_CONS_WITH_STACKER(U, UISC, UGC): def is_CONS_WITH_STACKER(U, UISC, UGC):
return UISC == Consonant_With_Stacker return UISC == Consonant_With_Stacker
def is_HALANT(U, UISC, UGC): def is_HALANT(U, UISC, UGC):
return UISC in [Virama, Invisible_Stacker] return UISC in [Virama, Invisible_Stacker] and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC)
def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC):
# https://github.com/harfbuzz/harfbuzz/issues/1102
return U == 0x11046
def is_HALANT_NUM(U, UISC, UGC): def is_HALANT_NUM(U, UISC, UGC):
return UISC == Number_Joiner return UISC == Number_Joiner
def is_ZWNJ(U, UISC, UGC): def is_ZWNJ(U, UISC, UGC):
@ -248,6 +251,7 @@ use_mapping = {
'SUB': is_CONS_SUB, 'SUB': is_CONS_SUB,
'CS': is_CONS_WITH_STACKER, 'CS': is_CONS_WITH_STACKER,
'H': is_HALANT, 'H': is_HALANT,
'HVM': is_HALANT_OR_VOWEL_MODIFIER,
'HN': is_HALANT_NUM, 'HN': is_HALANT_NUM,
'ZWNJ': is_ZWNJ, 'ZWNJ': is_ZWNJ,
'ZWJ': is_ZWJ, 'ZWJ': is_ZWJ,
@ -295,6 +299,7 @@ use_positions = {
'Blw': [Bottom], 'Blw': [Bottom],
}, },
'H': None, 'H': None,
'HVM': None,
'B': None, 'B': None,
'FM': None, 'FM': None,
'SUB': None, 'SUB': None,

View File

@ -369,37 +369,6 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
out_len += num_out; out_len += num_out;
} }
void
hb_buffer_t::output_glyph (hb_codepoint_t glyph_index)
{
if (unlikely (!make_room_for (0, 1))) return;
out_info[out_len] = info[idx];
out_info[out_len].codepoint = glyph_index;
out_len++;
}
void
hb_buffer_t::output_info (const hb_glyph_info_t &glyph_info)
{
if (unlikely (!make_room_for (0, 1))) return;
out_info[out_len] = glyph_info;
out_len++;
}
void
hb_buffer_t::copy_glyph (void)
{
if (unlikely (!make_room_for (0, 1))) return;
out_info[out_len] = info[idx];
out_len++;
}
bool bool
hb_buffer_t::move_to (unsigned int i) hb_buffer_t::move_to (unsigned int i)
{ {
@ -442,19 +411,6 @@ hb_buffer_t::move_to (unsigned int i)
return true; return true;
} }
void
hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index)
{
if (unlikely (out_info != info || out_len != idx)) {
if (unlikely (!make_room_for (1, 1))) return;
out_info[out_len] = info[idx];
}
out_info[out_len].codepoint = glyph_index;
idx++;
out_len++;
}
void void
hb_buffer_t::set_masks (hb_mask_t value, hb_buffer_t::set_masks (hb_mask_t value,

View File

@ -212,13 +212,46 @@ struct hb_buffer_t
unsigned int num_out, unsigned int num_out,
const hb_codepoint_t *glyph_data); const hb_codepoint_t *glyph_data);
HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index); inline void replace_glyph (hb_codepoint_t glyph_index)
{
if (unlikely (out_info != info || out_len != idx)) {
if (unlikely (!make_room_for (1, 1))) return;
out_info[out_len] = info[idx];
}
out_info[out_len].codepoint = glyph_index;
idx++;
out_len++;
}
/* Makes a copy of the glyph at idx to output and replace glyph_index */ /* Makes a copy of the glyph at idx to output and replace glyph_index */
HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index); inline hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info); {
if (unlikely (!make_room_for (0, 1))) return Crap(hb_glyph_info_t);
out_info[out_len] = info[idx];
out_info[out_len].codepoint = glyph_index;
out_len++;
return out_info[out_len - 1];
}
inline void output_info (const hb_glyph_info_t &glyph_info)
{
if (unlikely (!make_room_for (0, 1))) return;
out_info[out_len] = glyph_info;
out_len++;
}
/* Copies glyph at idx to output but doesn't advance idx */ /* Copies glyph at idx to output but doesn't advance idx */
HB_INTERNAL void copy_glyph (void); inline void copy_glyph (void)
HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */ {
if (unlikely (!make_room_for (0, 1))) return;
out_info[out_len] = info[idx];
out_len++;
}
/* Copies glyph at idx to output and advance idx. /* Copies glyph at idx to output and advance idx.
* If there's no output, just advance idx. */ * If there's no output, just advance idx. */
inline void inline void
@ -235,10 +268,11 @@ struct hb_buffer_t
idx++; idx++;
} }
/* Advance idx without copying to output. */ /* Advance idx without copying to output. */
inline void skip_glyph (void) { idx++; } inline void skip_glyph (void)
{
idx++;
}
inline void reset_masks (hb_mask_t mask) inline void reset_masks (hb_mask_t mask)
{ {
for (unsigned int j = 0; j < len; j++) for (unsigned int j = 0; j < len; j++)
@ -275,6 +309,8 @@ struct hb_buffer_t
/* Internal methods */ /* Internal methods */
HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
HB_INTERNAL bool enlarge (unsigned int size); HB_INTERNAL bool enlarge (unsigned int size);
inline bool ensure (unsigned int size) inline bool ensure (unsigned int size)

View File

@ -1072,7 +1072,7 @@ hb_variation_to_string (hb_variation_t *variation,
while (len && s[len - 1] == ' ') while (len && s[len - 1] == ' ')
len--; len--;
s[len++] = '='; s[len++] = '=';
len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", variation->value)); len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value));
assert (len < ARRAY_LENGTH (s)); assert (len < ARRAY_LENGTH (s));
len = MIN (len, size - 1); len = MIN (len, size - 1);

View File

@ -626,7 +626,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
/* Attach marks to their bases, to match the 'ot' shaper. /* Attach marks to their bases, to match the 'ot' shaper.
* Adapted from hb-ot-shape:hb_form_clusters(). * Adapted from a very old version of hb-ot-shape:hb_form_clusters().
* Note that this only makes us be closer to the 'ot' shaper, * Note that this only makes us be closer to the 'ot' shaper,
* but by no means the same. For example, if there's * but by no means the same. For example, if there's
* B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will

View File

@ -688,7 +688,7 @@ _hb_face_builder_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data
* After tables are added to the face, it can be compiled to a binary * After tables are added to the face, it can be compiled to a binary
* font file by calling hb_face_reference_blob(). * font file by calling hb_face_reference_blob().
* *
* Return value: (transfer full) New face. * Return value: (transfer full): New face.
* *
* Since: 1.9.0 * Since: 1.9.0
**/ **/

View File

@ -95,6 +95,32 @@ retry:
return d; return d;
} }
static void hb_graphite2_release_table(const void *data, const void *table_buffer)
{
hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
hb_graphite2_tablelist_t *tlist = face_data->tlist.get();
hb_graphite2_tablelist_t *prev = nullptr;
hb_graphite2_tablelist_t *curr = tlist;
while (curr)
{
if (hb_blob_get_data(curr->blob, nullptr) == table_buffer)
{
if (prev == nullptr)
face_data->tlist.cmpexch(tlist, curr->next);
else
prev->next = curr->next;
hb_blob_destroy(curr->blob);
free(curr);
break;
}
prev = curr;
curr = curr->next;
}
}
static gr_face_ops hb_graphite2_face_ops = { sizeof(gr_face_ops), hb_graphite2_get_table, hb_graphite2_release_table };
hb_graphite2_face_data_t * hb_graphite2_face_data_t *
_hb_graphite2_shaper_face_data_create (hb_face_t *face) _hb_graphite2_shaper_face_data_create (hb_face_t *face)
{ {
@ -113,7 +139,7 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face)
return nullptr; return nullptr;
data->face = face; data->face = face;
data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll); data->grface = gr_make_face_with_ops (data, &hb_graphite2_face_ops, gr_face_preloadAll);
if (unlikely (!data->grface)) { if (unlikely (!data->grface)) {
free (data); free (data);

View File

@ -160,12 +160,12 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font,
#define foreach_syllable(buffer, start, end) \ #define foreach_syllable(buffer, start, end) \
for (unsigned int \ for (unsigned int \
_count = buffer->len, \ _count = buffer->len, \
start = 0, end = _count ? _next_syllable (buffer, 0) : 0; \ start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \
start < _count; \ start < _count; \
start = end, end = _next_syllable (buffer, start)) start = end, end = _hb_next_syllable (buffer, start))
static inline unsigned int static inline unsigned int
_next_syllable (hb_buffer_t *buffer, unsigned int start) _hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
{ {
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len; unsigned int count = buffer->len;
@ -188,7 +188,7 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
* * Whether it's one of the three Mongolian Free Variation Selectors, * * Whether it's one of the three Mongolian Free Variation Selectors,
* CGJ, or other characters that are hidden but should not be ignored * CGJ, or other characters that are hidden but should not be ignored
* like most other Default_Ignorable()s do during matching. * like most other Default_Ignorable()s do during matching.
* * One free bit right now. * * Whether it's a grapheme continuation.
* *
* The high-byte has different meanings, switched by the Gen-Cat: * The high-byte has different meanings, switched by the Gen-Cat:
* - For Mn,Mc,Me: the modified Combining_Class. * - For Mn,Mc,Me: the modified Combining_Class.
@ -200,8 +200,8 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
enum hb_unicode_props_flags_t { enum hb_unicode_props_flags_t {
UPROPS_MASK_GEN_CAT = 0x001Fu, UPROPS_MASK_GEN_CAT = 0x001Fu,
UPROPS_MASK_IGNORABLE = 0x0020u, UPROPS_MASK_IGNORABLE = 0x0020u,
UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */
* or TAG characters */ UPROPS_MASK_CONTINUATION=0x0080u,
/* If GEN_CAT=FORMAT, top byte masks: */ /* If GEN_CAT=FORMAT, top byte masks: */
UPROPS_MASK_Cf_ZWJ = 0x0100u, UPROPS_MASK_Cf_ZWJ = 0x0100u,
@ -220,6 +220,7 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
if (u >= 0x80) if (u >= 0x80)
{ {
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
if (unlikely (unicode->is_default_ignorable (u))) if (unlikely (unicode->is_default_ignorable (u)))
{ {
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
@ -245,24 +246,10 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
props |= UPROPS_MASK_HIDDEN; props |= UPROPS_MASK_HIDDEN;
} }
} }
else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK (gen_cat)))
{
/* The above check is just an optimization to let in only things we need further
* processing on. */
/* Only Mn and Mc can have non-zero ccc: if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
* https://unicode.org/policies/stability_policy.html#Property_Value {
* """ props |= UPROPS_MASK_CONTINUATION;
* Canonical_Combining_Class, General_Category
* All characters other than those with General_Category property values
* Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class
* property value 0.
* 1.1.5+
* """
*
* Also, all Mn's that are Default_Ignorable, have ccc=0, hence
* the "else if".
*/
props |= unicode->modified_combining_class (u)<<8; props |= unicode->modified_combining_class (u)<<8;
} }
} }
@ -302,29 +289,6 @@ _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
{ {
return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0; return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
} }
/* Loop over grapheme. Based on foreach_cluster(). */
#define foreach_grapheme(buffer, start, end) \
for (unsigned int \
_count = buffer->len, \
start = 0, end = _count ? _next_grapheme (buffer, 0) : 0; \
start < _count; \
start = end, end = _next_grapheme (buffer, start))
static inline unsigned int
_next_grapheme (hb_buffer_t *buffer, unsigned int start)
{
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
while (++start < count && _hb_glyph_info_is_unicode_mark (&info[start]))
;
return start;
}
#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info))) #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
static inline bool static inline bool
@ -369,6 +333,41 @@ _hb_glyph_info_unhide (hb_glyph_info_t *info)
info->unicode_props() &= ~ UPROPS_MASK_HIDDEN; info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
} }
static inline void
_hb_glyph_info_set_continuation (hb_glyph_info_t *info)
{
info->unicode_props() |= UPROPS_MASK_CONTINUATION;
}
static inline void
_hb_glyph_info_reset_continuation (hb_glyph_info_t *info)
{
info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION;
}
static inline bool
_hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
{
return info->unicode_props() & UPROPS_MASK_CONTINUATION;
}
/* Loop over grapheme. Based on foreach_cluster(). */
#define foreach_grapheme(buffer, start, end) \
for (unsigned int \
_count = buffer->len, \
start = 0, end = _count ? _hb_next_grapheme (buffer, 0) : 0; \
start < _count; \
start = end, end = _hb_next_grapheme (buffer, start))
static inline unsigned int
_hb_next_grapheme (hb_buffer_t *buffer, unsigned int start)
{
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
while (++start < count && _hb_glyph_info_is_continuation (&info[start]))
;
return start;
}
static inline bool static inline bool
_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info) _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
{ {

View File

@ -81,7 +81,7 @@ struct os2
hb_codepoint_t cp = HB_SET_VALUE_INVALID; hb_codepoint_t cp = HB_SET_VALUE_INVALID;
while (codepoints->next (&cp)) { while (codepoints->next (&cp)) {
unsigned int bit = hb_get_unicode_range_bit (cp); unsigned int bit = _hb_ot_os2_get_unicode_range_bit (cp);
if (bit < 128) if (bit < 128)
{ {
unsigned int block = bit / 32; unsigned int block = bit / 32;

View File

@ -31,14 +31,29 @@
namespace OT { namespace OT {
struct Range { struct OS2Range
{
static int
cmp (const void *_key, const void *_item, void *_arg)
{
hb_codepoint_t cp = *((hb_codepoint_t *) _key);
const OS2Range *range = (OS2Range *) _item;
if (cp < range->start)
return -1;
else if (cp <= range->end)
return 0;
else
return +1;
}
hb_codepoint_t start; hb_codepoint_t start;
hb_codepoint_t end; hb_codepoint_t end;
unsigned int bit; unsigned int bit;
}; };
/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */ /* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */
static Range os2UnicodeRangesSorted[] = static const OS2Range _hb_os2_unicode_ranges[] =
{ {
{ 0x0, 0x7F, 0}, // Basic Latin { 0x0, 0x7F, 0}, // Basic Latin
{ 0x80, 0xFF, 1}, // Latin-1 Supplement { 0x80, 0xFF, 1}, // Latin-1 Supplement
@ -211,31 +226,17 @@ static Range os2UnicodeRangesSorted[] =
{0x100000, 0x10FFFD, 90}, // Private Use (plane 16) {0x100000, 0x10FFFD, 90}, // Private Use (plane 16)
}; };
static int
_compare_range (const void *_key, const void *_item, void *_arg)
{
hb_codepoint_t cp = *((hb_codepoint_t *) _key);
const Range *range = (Range *) _item;
if (cp < range->start)
return -1;
else if (cp <= range->end)
return 0;
else
return 1;
}
/** /**
* hb_get_unicode_range_bit: * _hb_ot_os2_get_unicode_range_bit:
* Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint. * Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint.
**/ **/
static unsigned int static unsigned int
hb_get_unicode_range_bit (hb_codepoint_t cp) _hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp)
{ {
Range *range = (Range*) hb_bsearch_r (&cp, os2UnicodeRangesSorted, OS2Range *range = (OS2Range*) hb_bsearch_r (&cp, _hb_os2_unicode_ranges,
sizeof (os2UnicodeRangesSorted) / sizeof(Range), ARRAY_LENGTH (_hb_os2_unicode_ranges),
sizeof(Range), sizeof (OS2Range),
_compare_range, nullptr); OS2Range::cmp, nullptr);
if (range != nullptr) if (range != nullptr)
return range->bit; return range->bit;
return -1; return -1;

View File

@ -331,6 +331,275 @@ data_destroy_indic (void *data)
free (data); free (data);
} }
static void
_output_with_dotted_circle (hb_buffer_t *buffer)
{
hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
_hb_glyph_info_reset_continuation (&dottedcircle);
buffer->next_glyph ();
}
static void
preprocess_text_indic (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer,
hb_font_t *font)
{
/* UGLY UGLY UGLY business of adding dotted-circle in the middle of
* vowel-sequences that look like another vowel. Data for each script
* collected from Unicode 11 book, tables named "Vowel Letters" with
* "Use" and "Do Not Use" columns.
*
* https://github.com/harfbuzz/harfbuzz/issues/1019
*/
bool processed = false;
buffer->clear_output ();
unsigned int count = buffer->len;
switch ((unsigned) buffer->props.script)
{
case HB_SCRIPT_DEVANAGARI:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0905u:
switch (buffer->cur(1).codepoint)
{
case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
matched = true;
break;
}
break;
case 0x0906u:
switch (buffer->cur(1).codepoint)
{
case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
case 0x0948u:
matched = true;
break;
}
break;
case 0x0909u:
switch (buffer->cur(1).codepoint)
{
case 0x0941u:
matched = true;
break;
}
break;
case 0x090Fu:
switch (buffer->cur(1).codepoint)
{
case 0x0945u: case 0x0946u: case 0x0947u:
matched = true;
break;
}
break;
case 0x0930u:
if (0x094Du == buffer->cur(1).codepoint &&
buffer->idx + 2 < count &&
0x0907u == buffer->cur(2).codepoint)
{
buffer->next_glyph ();
buffer->next_glyph ();
buffer->output_glyph (0x25CCu);
}
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_BENGALI:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0985u:
matched = 0x09BE == buffer->cur(1).codepoint;
break;
case 0x098Bu:
matched = 0x09C3 == buffer->cur(1).codepoint;
break;
case 0x098Cu:
matched = 0x09E2 == buffer->cur(1).codepoint;
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_GURMUKHI:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0A05u:
switch (buffer->cur(1).codepoint)
{
case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
matched = true;
break;
}
break;
case 0x0A72u:
switch (buffer->cur(1).codepoint)
{
case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
matched = true;
break;
}
break;
case 0x0A73u:
switch (buffer->cur(1).codepoint)
{
case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
matched = true;
break;
}
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_GUJARATI:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0A85u:
switch (buffer->cur(1).codepoint)
{
case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
matched = true;
break;
}
break;
case 0x0AC5u:
matched = 0x0ABE == buffer->cur(1).codepoint;
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_ORIYA:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0B05u:
matched = 0x0B3E == buffer->cur(1).codepoint;
break;
case 0x0B0Fu: case 0x0B13u:
matched = 0x0B57 == buffer->cur(1).codepoint;
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_TELUGU:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0C12u:
switch (buffer->cur(1).codepoint)
{
case 0x0C4Cu: case 0x0C55u:
matched = true;
break;
}
break;
case 0x0C3Fu: case 0x0C46u: case 0xC4Au:
matched = 0x0C55 == buffer->cur(1).codepoint;
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_KANNADA:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0C89u: case 0x0C8Bu:
matched = 0x0CBE == buffer->cur(1).codepoint;
break;
case 0x0C92u:
matched = 0x0CCC == buffer->cur(1).codepoint;
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
case HB_SCRIPT_MALAYALAM:
for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
{
bool matched = false;
switch (buffer->cur().codepoint)
{
case 0x0D07u: case 0x0D09u:
matched = 0x0D57 == buffer->cur(1).codepoint;
break;
case 0x0D0Eu:
matched = 0x0D46 == buffer->cur(1).codepoint;
break;
case 0x0D12u:
switch (buffer->cur(1).codepoint)
{
case 0x0D3Eu: case 0x0D57u:
matched = true;
break;
}
break;
}
buffer->next_glyph ();
if (matched) _output_with_dotted_circle (buffer);
}
processed = true;
break;
default:
break;
}
if (processed)
{
if (buffer->idx < count)
buffer->next_glyph ();
if (likely (buffer->successful))
buffer->swap_buffers ();
}
}
static indic_position_t static indic_position_t
consonant_position_from_face (const indic_shape_plan_t *indic_plan, consonant_position_from_face (const indic_shape_plan_t *indic_plan,
const hb_codepoint_t consonant, const hb_codepoint_t consonant,
@ -963,7 +1232,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font, hb_font_t *font,
hb_buffer_t *buffer) hb_buffer_t *buffer)
{ {
/* Note: This loop is extra overhead, but should not be measurable. */ /* Note: This loop is extra overhead, but should not be measurable.
* TODO Use a buffer scratch flag to remove the loop. */
bool has_broken_syllables = false; bool has_broken_syllables = false;
unsigned int count = buffer->len; unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
@ -1614,7 +1884,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
override_features_indic, override_features_indic,
data_create_indic, data_create_indic,
data_destroy_indic, data_destroy_indic,
nullptr, /* preprocess_text */ preprocess_text_indic,
nullptr, /* postprocess_glyphs */ nullptr, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
decompose_indic, decompose_indic,

View File

@ -324,9 +324,9 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
} }
/* Is SARA AM. Decompose and reorder. */ /* Is SARA AM. Decompose and reorder. */
hb_codepoint_t decomposed[2] = {hb_codepoint_t (NIKHAHIT_FROM_SARA_AM (u)), hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
hb_codepoint_t (SARA_AA_FROM_SARA_AM (u))}; _hb_glyph_info_set_continuation (&nikhahit);
buffer->replace_glyphs (1, 2, decomposed); buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u));
if (unlikely (!buffer->successful)) if (unlikely (!buffer->successful))
return; return;
@ -357,6 +357,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
buffer->merge_out_clusters (start - 1, end); buffer->merge_out_clusters (start - 1, end);
} }
} }
if (likely (buffer->successful))
buffer->swap_buffers (); buffer->swap_buffers ();
/* If font has Thai GSUB, we are done. */ /* If font has Thai GSUB, we are done. */

View File

@ -36,227 +36,266 @@
#line 38 "hb-ot-shape-complex-use-machine.hh" #line 38 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = { static const unsigned char _use_syllable_machine_trans_keys[] = {
12u, 12u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u,
1u, 15u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u,
8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u,
8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u,
8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u,
8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u,
8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, 12u, 44u, 1u, 44u, 8u, 44u, 21u, 42u,
1u, 5u, 0 41u, 42u, 42u, 42u, 1u, 5u, 0
}; };
static const char _use_syllable_machine_key_spans[] = { static const char _use_syllable_machine_key_spans[] = {
1, 15, 1, 1, 44, 1, 32, 32, 33, 15, 1, 33, 45, 1, 37, 37,
15, 1, 32, 32, 32, 19, 19, 19, 15, 1, 37, 37, 32, 19, 19, 19,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 37, 37, 37, 37, 37,
32, 32, 32, 32, 9, 1, 1, 32, 37, 37, 37, 39, 37, 9, 1, 1,
32, 32, 32, 19, 19, 19, 32, 32, 37, 37, 37, 32, 19, 19, 19, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 37, 37, 37, 37, 37, 37,
32, 15, 1, 39, 32, 22, 2, 1, 37, 37, 39, 15, 33, 44, 37, 22,
5 2, 1, 5
}; };
static const short _use_syllable_machine_index_offsets[] = { static const short _use_syllable_machine_index_offsets[] = {
0, 2, 18, 20, 22, 67, 69, 102, 0, 34, 50, 52, 86, 132, 134, 172,
135, 151, 153, 186, 219, 252, 272, 292, 210, 226, 228, 266, 304, 337, 357, 377,
312, 345, 378, 411, 444, 477, 510, 543, 397, 430, 463, 496, 534, 572, 610, 648,
576, 609, 642, 675, 708, 718, 720, 722, 686, 724, 762, 800, 840, 878, 888, 890,
755, 788, 821, 854, 874, 894, 914, 947, 892, 930, 968, 1006, 1039, 1059, 1079, 1099,
980, 1013, 1046, 1079, 1112, 1145, 1178, 1211, 1132, 1165, 1198, 1236, 1274, 1312, 1350, 1388,
1244, 1277, 1293, 1295, 1335, 1368, 1391, 1394, 1426, 1464, 1502, 1542, 1558, 1592, 1637, 1675,
1396 1698, 1701, 1703
}; };
static const char _use_syllable_machine_indicies[] = { static const char _use_syllable_machine_indicies[] = {
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 3, 2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
4, 2, 3, 2, 6, 5, 7, 8, 4, 2, 3, 2, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 6, 5, 7, 8,
9, 7, 10, 8, 9, 9, 11, 9, 9, 7, 10, 8, 9, 9, 11, 9,
9, 3, 12, 9, 9, 13, 7, 7, 9, 3, 12, 9, 9, 13, 7, 7,
14, 15, 9, 9, 16, 17, 18, 19, 14, 15, 9, 9, 16, 17, 18, 19,
20, 21, 22, 16, 23, 24, 25, 26, 20, 21, 22, 16, 23, 24, 25, 26,
27, 28, 9, 29, 30, 31, 9, 9, 27, 28, 9, 29, 30, 31, 9, 9,
9, 32, 9, 34, 33, 36, 35, 35, 9, 32, 33, 9, 35, 34, 37, 36,
37, 1, 35, 35, 38, 35, 35, 35, 36, 38, 1, 36, 36, 39, 36, 36,
35, 35, 39, 40, 41, 42, 43, 44, 36, 36, 36, 40, 41, 42, 43, 44,
45, 46, 40, 47, 39, 48, 49, 50, 45, 46, 47, 41, 48, 40, 49, 50,
51, 35, 52, 53, 54, 35, 36, 35, 51, 52, 36, 53, 54, 55, 36, 36,
35, 37, 1, 35, 35, 38, 35, 35, 36, 36, 56, 36, 37, 36, 36, 38,
35, 35, 35, 55, 40, 41, 42, 43, 1, 36, 36, 39, 36, 36, 36, 36,
44, 45, 46, 40, 47, 48, 48, 49, 36, 57, 41, 42, 43, 44, 45, 46,
50, 51, 35, 52, 53, 54, 35, 37, 47, 41, 48, 49, 49, 50, 51, 52,
56, 56, 56, 56, 56, 56, 56, 56, 36, 53, 54, 55, 36, 36, 36, 36,
56, 56, 56, 56, 56, 57, 56, 37, 56, 36, 38, 58, 58, 58, 58, 58,
56, 36, 35, 35, 37, 1, 35, 35, 58, 58, 58, 58, 58, 58, 58, 58,
38, 35, 35, 35, 35, 35, 35, 40, 59, 58, 38, 58, 37, 36, 36, 38,
41, 42, 43, 44, 45, 46, 40, 47, 1, 36, 36, 39, 36, 36, 36, 36,
48, 48, 49, 50, 51, 35, 52, 53, 36, 36, 41, 42, 43, 44, 45, 46,
54, 35, 36, 35, 35, 35, 35, 35, 47, 41, 48, 49, 49, 50, 51, 52,
35, 35, 35, 35, 35, 35, 35, 35, 36, 53, 54, 55, 36, 36, 36, 36,
40, 41, 42, 43, 44, 35, 35, 35, 56, 36, 37, 36, 36, 36, 36, 36,
35, 35, 35, 49, 50, 51, 35, 52, 36, 36, 36, 36, 36, 36, 36, 36,
53, 54, 35, 36, 35, 35, 35, 35, 41, 42, 43, 44, 45, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 50, 51, 52, 36, 53,
35, 35, 41, 42, 43, 44, 35, 35, 54, 55, 36, 36, 36, 36, 42, 36,
35, 35, 35, 35, 35, 35, 35, 35, 37, 36, 36, 36, 36, 36, 36, 36,
52, 53, 54, 35, 36, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 42,
35, 35, 35, 35, 35, 35, 35, 35, 43, 44, 45, 36, 36, 36, 36, 36,
35, 35, 35, 35, 42, 43, 44, 35, 36, 36, 36, 36, 36, 53, 54, 55,
36, 35, 35, 35, 35, 35, 35, 35, 36, 37, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 43, 44, 35, 36, 35, 35, 35, 36, 43, 44, 45, 36, 37, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 44, 35, 36, 36, 36, 36, 36, 36, 44, 45,
36, 35, 35, 35, 35, 35, 35, 35, 36, 37, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
42, 43, 44, 35, 35, 35, 35, 35, 36, 36, 36, 45, 36, 37, 36, 36,
35, 35, 35, 35, 35, 52, 53, 54, 36, 36, 36, 36, 36, 36, 36, 36,
35, 36, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 43, 44, 45,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 42, 43, 44, 35, 35, 35, 35, 36, 36, 53, 54, 55, 36, 37, 36,
35, 35, 35, 35, 35, 35, 35, 53, 36, 36, 36, 36, 36, 36, 36, 36,
54, 35, 36, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 43, 44,
35, 35, 35, 35, 35, 35, 35, 35, 45, 36, 36, 36, 36, 36, 36, 36,
35, 35, 42, 43, 44, 35, 35, 35, 36, 36, 36, 36, 54, 55, 36, 37,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 54, 35, 36, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 43,
35, 35, 35, 35, 35, 35, 35, 35, 44, 45, 36, 36, 36, 36, 36, 36,
35, 35, 41, 42, 43, 44, 35, 35, 36, 36, 36, 36, 36, 36, 55, 36,
35, 35, 35, 35, 49, 50, 51, 35, 37, 36, 36, 36, 36, 36, 36, 36,
52, 53, 54, 35, 36, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 42,
35, 35, 35, 35, 35, 35, 35, 35, 43, 44, 45, 36, 36, 36, 36, 36,
35, 35, 35, 41, 42, 43, 44, 35, 36, 50, 51, 52, 36, 53, 54, 55,
35, 35, 35, 35, 35, 35, 50, 51, 36, 36, 36, 36, 42, 36, 37, 36,
35, 52, 53, 54, 35, 36, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 42, 43, 44,
35, 35, 35, 35, 41, 42, 43, 44, 45, 36, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 51, 52, 36, 53, 54, 55, 36, 36,
51, 35, 52, 53, 54, 35, 36, 35, 36, 36, 42, 36, 37, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 35, 35, 35, 40, 41, 42, 43, 36, 36, 36, 42, 43, 44, 45, 36,
44, 35, 46, 40, 35, 35, 35, 49, 36, 36, 36, 36, 36, 36, 36, 52,
50, 51, 35, 52, 53, 54, 35, 36, 36, 53, 54, 55, 36, 36, 36, 36,
35, 35, 35, 35, 35, 35, 35, 35, 42, 36, 37, 36, 36, 36, 36, 36,
35, 35, 35, 35, 35, 40, 41, 42, 36, 36, 36, 36, 36, 36, 36, 36,
43, 44, 35, 58, 40, 35, 35, 35, 41, 42, 43, 44, 45, 36, 47, 41,
49, 50, 51, 35, 52, 53, 54, 35, 36, 36, 36, 50, 51, 52, 36, 53,
36, 35, 35, 35, 35, 35, 35, 35, 54, 55, 36, 36, 36, 36, 42, 36,
35, 35, 35, 35, 35, 35, 40, 41, 37, 36, 36, 36, 36, 36, 36, 36,
42, 43, 44, 35, 35, 40, 35, 35, 36, 36, 36, 36, 36, 36, 41, 42,
35, 49, 50, 51, 35, 52, 53, 54, 43, 44, 45, 36, 60, 41, 36, 36,
35, 36, 35, 35, 35, 35, 35, 35, 36, 50, 51, 52, 36, 53, 54, 55,
35, 35, 35, 35, 35, 35, 35, 40, 36, 36, 36, 36, 42, 36, 37, 36,
41, 42, 43, 44, 45, 46, 40, 35, 36, 36, 36, 36, 36, 36, 36, 36,
35, 35, 49, 50, 51, 35, 52, 53, 36, 36, 36, 36, 41, 42, 43, 44,
54, 35, 36, 35, 35, 37, 1, 35, 45, 36, 36, 41, 36, 36, 36, 50,
35, 38, 35, 35, 35, 35, 35, 35, 51, 52, 36, 53, 54, 55, 36, 36,
40, 41, 42, 43, 44, 45, 46, 40, 36, 36, 42, 36, 37, 36, 36, 36,
47, 35, 48, 49, 50, 51, 35, 52, 36, 36, 36, 36, 36, 36, 36, 36,
53, 54, 35, 36, 35, 35, 37, 1, 36, 36, 41, 42, 43, 44, 45, 46,
35, 35, 38, 35, 35, 35, 35, 35, 47, 41, 36, 36, 36, 50, 51, 52,
35, 40, 41, 42, 43, 44, 45, 46, 36, 53, 54, 55, 36, 36, 36, 36,
40, 47, 39, 48, 49, 50, 51, 35, 42, 36, 37, 36, 36, 38, 1, 36,
52, 53, 54, 35, 60, 59, 59, 59, 36, 39, 36, 36, 36, 36, 36, 36,
59, 59, 59, 59, 61, 59, 10, 62, 41, 42, 43, 44, 45, 46, 47, 41,
60, 59, 11, 63, 63, 3, 6, 63, 48, 36, 49, 50, 51, 52, 36, 53,
63, 64, 63, 63, 63, 63, 63, 65, 54, 55, 36, 36, 36, 36, 56, 36,
38, 58, 58, 58, 58, 58, 58, 37,
58, 58, 58, 58, 58, 58, 59, 58,
58, 58, 58, 58, 58, 58, 42, 43,
44, 45, 58, 58, 58, 58, 58, 58,
58, 58, 58, 58, 53, 54, 55, 58,
37, 36, 36, 38, 1, 36, 36, 39,
36, 36, 36, 36, 36, 36, 41, 42,
43, 44, 45, 46, 47, 41, 48, 40,
49, 50, 51, 52, 36, 53, 54, 55,
36, 36, 36, 36, 56, 36, 62, 61,
61, 61, 61, 61, 61, 61, 63, 61,
10, 64, 62, 61, 11, 65, 65, 3,
6, 65, 65, 66, 65, 65, 65, 65,
65, 67, 16, 17, 18, 19, 20, 21,
22, 16, 23, 25, 25, 26, 27, 28,
65, 29, 30, 31, 65, 65, 65, 65,
33, 65, 11, 65, 65, 3, 6, 65,
65, 66, 65, 65, 65, 65, 65, 65,
16, 17, 18, 19, 20, 21, 22, 16, 16, 17, 18, 19, 20, 21, 22, 16,
23, 25, 25, 26, 27, 28, 63, 29, 23, 25, 25, 26, 27, 28, 65, 29,
30, 31, 63, 11, 63, 63, 3, 6, 30, 31, 65, 65, 65, 65, 33, 65,
63, 63, 64, 63, 63, 63, 63, 63, 11, 65, 65, 65, 65, 65, 65, 65,
63, 16, 17, 18, 19, 20, 21, 22, 65, 65, 65, 65, 65, 65, 16, 17,
16, 23, 25, 25, 26, 27, 28, 63, 18, 19, 20, 65, 65, 65, 65, 65,
29, 30, 31, 63, 11, 63, 63, 63, 65, 26, 27, 28, 65, 29, 30, 31,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 17, 65, 11, 65,
63, 63, 16, 17, 18, 19, 20, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 26, 27, 28, 65, 65, 65, 65, 65, 17, 18, 19,
63, 29, 30, 31, 63, 11, 63, 63, 20, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 29, 30, 31, 65, 11,
63, 63, 63, 63, 17, 18, 19, 20, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 18,
63, 63, 29, 30, 31, 63, 11, 63, 19, 20, 65, 11, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 18, 19, 65, 65, 65, 65, 19, 20, 65, 11,
20, 63, 11, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 19, 20, 63, 11, 63, 65, 20, 65, 11, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 18, 19, 20, 65, 65,
20, 63, 11, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 29, 30, 31, 65, 11, 65, 65, 65,
63, 63, 18, 19, 20, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 29, 65, 65, 65, 65, 18, 19, 20, 65,
30, 31, 63, 11, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 30, 31, 65, 11, 65, 65,
63, 63, 63, 18, 19, 20, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 18, 19, 20,
63, 30, 31, 63, 11, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 31, 65, 11, 65,
63, 63, 63, 63, 18, 19, 20, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 17, 18, 19,
63, 63, 63, 31, 63, 11, 63, 63, 20, 65, 65, 65, 65, 65, 65, 26,
63, 63, 63, 63, 63, 63, 63, 63, 27, 28, 65, 29, 30, 31, 65, 65,
63, 63, 63, 63, 17, 18, 19, 20, 65, 65, 17, 65, 11, 65, 65, 65,
63, 63, 63, 63, 63, 63, 26, 27, 65, 65, 65, 65, 65, 65, 65, 65,
28, 63, 29, 30, 31, 63, 11, 63, 65, 65, 65, 17, 18, 19, 20, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 27, 28,
63, 63, 63, 63, 63, 17, 18, 19, 65, 29, 30, 31, 65, 65, 65, 65,
20, 63, 63, 63, 63, 63, 63, 63, 17, 65, 11, 65, 65, 65, 65, 65,
27, 28, 63, 29, 30, 31, 63, 11, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 17, 18, 19, 20, 65, 65, 65,
63, 63, 63, 63, 63, 63, 17, 18, 65, 65, 65, 65, 65, 28, 65, 29,
19, 20, 63, 63, 63, 63, 63, 63, 30, 31, 65, 65, 65, 65, 17, 65,
63, 63, 28, 63, 29, 30, 31, 63, 11, 65, 65, 65, 65, 65, 65, 65,
11, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 16, 17,
63, 63, 63, 63, 63, 63, 16, 17, 18, 19, 20, 65, 22, 16, 65, 65,
18, 19, 20, 63, 22, 16, 63, 63, 65, 26, 27, 28, 65, 29, 30, 31,
63, 26, 27, 28, 63, 29, 30, 31, 65, 65, 65, 65, 17, 65, 11, 65,
63, 11, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 16, 65, 65, 65, 65, 16, 17, 18, 19,
17, 18, 19, 20, 63, 66, 16, 63, 20, 65, 68, 16, 65, 65, 65, 26,
63, 63, 26, 27, 28, 63, 29, 30, 27, 28, 65, 29, 30, 31, 65, 65,
31, 63, 11, 63, 63, 63, 63, 63, 65, 65, 17, 65, 11, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 65, 65, 65, 65, 65, 65, 65, 65,
16, 17, 18, 19, 20, 63, 63, 16, 65, 65, 16, 17, 18, 19, 20, 65,
63, 63, 63, 26, 27, 28, 63, 29, 65, 16, 65, 65, 65, 26, 27, 28,
30, 31, 63, 11, 63, 63, 63, 63, 65, 29, 30, 31, 65, 65, 65, 65,
63, 63, 63, 63, 63, 63, 63, 63, 17, 65, 11, 65, 65, 65, 65, 65,
63, 16, 17, 18, 19, 20, 21, 22, 65, 65, 65, 65, 65, 65, 65, 65,
16, 63, 63, 63, 26, 27, 28, 63, 16, 17, 18, 19, 20, 21, 22, 16,
29, 30, 31, 63, 11, 63, 63, 3, 65, 65, 65, 26, 27, 28, 65, 29,
6, 63, 63, 64, 63, 63, 63, 63, 30, 31, 65, 65, 65, 65, 17, 65,
63, 63, 16, 17, 18, 19, 20, 21, 11, 65, 65, 3, 6, 65, 65, 66,
22, 16, 23, 63, 25, 26, 27, 28, 65, 65, 65, 65, 65, 65, 16, 17,
63, 29, 30, 31, 63, 3, 67, 67, 18, 19, 20, 21, 22, 16, 23, 65,
67, 67, 67, 67, 67, 67, 67, 67, 25, 26, 27, 28, 65, 29, 30, 31,
67, 67, 67, 4, 67, 6, 67, 8, 65, 65, 65, 65, 33, 65, 3, 65,
63, 63, 63, 8, 63, 63, 11, 63, 65, 65, 65, 65, 65, 11, 65, 65,
63, 3, 6, 63, 63, 64, 63, 63, 65, 65, 65, 65, 4, 65, 65, 65,
63, 63, 63, 63, 16, 17, 18, 19, 65, 65, 65, 65, 17, 18, 19, 20,
20, 21, 22, 16, 23, 24, 25, 26, 65, 65, 65, 65, 65, 65, 65, 65,
27, 28, 63, 29, 30, 31, 63, 11, 65, 65, 29, 30, 31, 65, 3, 69,
63, 63, 3, 6, 63, 63, 64, 63, 69, 69, 69, 69, 69, 69, 69, 69,
63, 63, 63, 63, 63, 16, 17, 18, 69, 69, 69, 69, 4, 69, 6, 69,
69, 69, 69, 69, 69, 69, 69, 69,
69, 69, 69, 69, 69, 69, 69, 69,
69, 69, 69, 69, 69, 69, 69, 69,
69, 69, 69, 69, 69, 69, 6, 69,
8, 65, 65, 65, 8, 65, 65, 11,
65, 65, 3, 6, 65, 65, 66, 65,
65, 65, 65, 65, 65, 16, 17, 18,
19, 20, 21, 22, 16, 23, 24, 25, 19, 20, 21, 22, 16, 23, 24, 25,
26, 27, 28, 63, 29, 30, 31, 63, 26, 27, 28, 65, 29, 30, 31, 65,
69, 68, 68, 68, 68, 68, 68, 68, 65, 65, 65, 33, 65, 11, 65, 65,
68, 68, 68, 68, 68, 68, 68, 68, 3, 6, 65, 65, 66, 65, 65, 65,
68, 68, 68, 68, 69, 70, 68, 69, 65, 65, 65, 16, 17, 18, 19, 20,
70, 68, 70, 68, 8, 67, 67, 67, 21, 22, 16, 23, 24, 25, 26, 27,
8, 67, 0 28, 65, 29, 30, 31, 65, 65, 65,
65, 33, 65, 71, 70, 70, 70, 70,
70, 70, 70, 70, 70, 70, 70, 70,
70, 70, 70, 70, 70, 70, 70, 71,
72, 70, 71, 72, 70, 72, 70, 8,
69, 69, 69, 8, 69, 0
}; };
static const char _use_syllable_machine_trans_targs[] = { static const char _use_syllable_machine_trans_targs[] = {
4, 8, 4, 31, 2, 4, 1, 5, 4, 8, 4, 32, 2, 4, 1, 5,
6, 4, 28, 4, 49, 50, 51, 53, 6, 4, 29, 4, 51, 52, 53, 55,
33, 34, 35, 36, 37, 44, 45, 47, 34, 35, 36, 37, 38, 45, 46, 48,
52, 48, 41, 42, 43, 38, 39, 40, 54, 49, 42, 43, 44, 39, 40, 41,
56, 4, 4, 4, 4, 7, 0, 27, 58, 50, 4, 4, 4, 4, 7, 0,
11, 12, 13, 14, 15, 22, 23, 25, 28, 11, 12, 13, 14, 15, 22, 23,
26, 19, 20, 21, 16, 17, 18, 10, 25, 26, 19, 20, 21, 16, 17, 18,
4, 9, 24, 4, 29, 30, 4, 4, 27, 10, 4, 9, 24, 4, 30, 31,
3, 32, 46, 4, 4, 54, 55 4, 4, 3, 33, 47, 4, 4, 56,
57
}; };
static const char _use_syllable_machine_trans_actions[] = { static const char _use_syllable_machine_trans_actions[] = {
@ -264,11 +303,12 @@ static const char _use_syllable_machine_trans_actions[] = {
7, 8, 0, 9, 10, 10, 3, 0, 7, 8, 0, 9, 10, 10, 3, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0,
0, 11, 12, 13, 14, 7, 0, 7, 0, 3, 11, 12, 13, 14, 7, 0,
0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0,
15, 0, 0, 16, 0, 0, 17, 18, 0, 7, 15, 0, 0, 16, 0, 0,
0, 3, 0, 19, 20, 0, 0 17, 18, 0, 3, 0, 19, 20, 0,
0
}; };
static const char _use_syllable_machine_to_state_actions[] = { static const char _use_syllable_machine_to_state_actions[] = {
@ -279,7 +319,7 @@ static const char _use_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0 0, 0, 0
}; };
static const char _use_syllable_machine_from_state_actions[] = { static const char _use_syllable_machine_from_state_actions[] = {
@ -290,18 +330,18 @@ static const char _use_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0 0, 0, 0
}; };
static const short _use_syllable_machine_eof_trans[] = { static const short _use_syllable_machine_eof_trans[] = {
1, 3, 3, 6, 0, 34, 36, 36, 1, 3, 3, 6, 0, 35, 37, 37,
57, 57, 36, 36, 36, 36, 36, 36, 59, 59, 37, 37, 37, 37, 37, 37,
36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37,
36, 36, 36, 36, 60, 63, 60, 64, 37, 37, 37, 59, 37, 62, 65, 62,
64, 64, 64, 64, 64, 64, 64, 64, 66, 66, 66, 66, 66, 66, 66, 66,
64, 64, 64, 64, 64, 64, 64, 64, 66, 66, 66, 66, 66, 66, 66, 66,
64, 68, 68, 64, 64, 69, 69, 69, 66, 66, 66, 70, 70, 66, 66, 71,
68 71, 71, 70
}; };
static const int use_syllable_machine_start = 4; static const int use_syllable_machine_start = 4;
@ -315,7 +355,7 @@ static const int use_syllable_machine_en_main = 4;
#line 140 "hb-ot-shape-complex-use-machine.rl" #line 143 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \ #define found_syllable(syllable_type) \
@ -334,7 +374,7 @@ find_syllables (hb_buffer_t *buffer)
int cs; int cs;
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
#line 338 "hb-ot-shape-complex-use-machine.hh" #line 378 "hb-ot-shape-complex-use-machine.hh"
{ {
cs = use_syllable_machine_start; cs = use_syllable_machine_start;
ts = 0; ts = 0;
@ -342,7 +382,7 @@ find_syllables (hb_buffer_t *buffer)
act = 0; act = 0;
} }
#line 160 "hb-ot-shape-complex-use-machine.rl" #line 163 "hb-ot-shape-complex-use-machine.rl"
p = 0; p = 0;
@ -350,7 +390,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int syllable_serial = 1; unsigned int syllable_serial = 1;
#line 354 "hb-ot-shape-complex-use-machine.hh" #line 394 "hb-ot-shape-complex-use-machine.hh"
{ {
int _slen; int _slen;
int _trans; int _trans;
@ -364,7 +404,7 @@ _resume:
#line 1 "NONE" #line 1 "NONE"
{ts = p;} {ts = p;}
break; break;
#line 368 "hb-ot-shape-complex-use-machine.hh" #line 408 "hb-ot-shape-complex-use-machine.hh"
} }
_keys = _use_syllable_machine_trans_keys + (cs<<1); _keys = _use_syllable_machine_trans_keys + (cs<<1);
@ -387,59 +427,59 @@ _eof_trans:
{te = p+1;} {te = p+1;}
break; break;
case 12: case 12:
#line 129 "hb-ot-shape-complex-use-machine.rl" #line 132 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (independent_cluster); }} {te = p+1;{ found_syllable (independent_cluster); }}
break; break;
case 14: case 14:
#line 131 "hb-ot-shape-complex-use-machine.rl" #line 134 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (standard_cluster); }} {te = p+1;{ found_syllable (standard_cluster); }}
break; break;
case 9: case 9:
#line 135 "hb-ot-shape-complex-use-machine.rl" #line 138 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }} {te = p+1;{ found_syllable (broken_cluster); }}
break; break;
case 8: case 8:
#line 136 "hb-ot-shape-complex-use-machine.rl" #line 139 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (non_cluster); }} {te = p+1;{ found_syllable (non_cluster); }}
break; break;
case 11: case 11:
#line 129 "hb-ot-shape-complex-use-machine.rl" #line 132 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (independent_cluster); }} {te = p;p--;{ found_syllable (independent_cluster); }}
break; break;
case 15: case 15:
#line 130 "hb-ot-shape-complex-use-machine.rl" #line 133 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }} {te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break; break;
case 13: case 13:
#line 131 "hb-ot-shape-complex-use-machine.rl" #line 134 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (standard_cluster); }} {te = p;p--;{ found_syllable (standard_cluster); }}
break; break;
case 17: case 17:
#line 132 "hb-ot-shape-complex-use-machine.rl" #line 135 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break; break;
case 16: case 16:
#line 133 "hb-ot-shape-complex-use-machine.rl" #line 136 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }} {te = p;p--;{ found_syllable (numeral_cluster); }}
break; break;
case 20: case 20:
#line 134 "hb-ot-shape-complex-use-machine.rl" #line 137 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }} {te = p;p--;{ found_syllable (symbol_cluster); }}
break; break;
case 18: case 18:
#line 135 "hb-ot-shape-complex-use-machine.rl" #line 138 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }} {te = p;p--;{ found_syllable (broken_cluster); }}
break; break;
case 19: case 19:
#line 136 "hb-ot-shape-complex-use-machine.rl" #line 139 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (non_cluster); }} {te = p;p--;{ found_syllable (non_cluster); }}
break; break;
case 1: case 1:
#line 131 "hb-ot-shape-complex-use-machine.rl" #line 134 "hb-ot-shape-complex-use-machine.rl"
{{p = ((te))-1;}{ found_syllable (standard_cluster); }} {{p = ((te))-1;}{ found_syllable (standard_cluster); }}
break; break;
case 4: case 4:
#line 135 "hb-ot-shape-complex-use-machine.rl" #line 138 "hb-ot-shape-complex-use-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }} {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break; break;
case 2: case 2:
@ -457,16 +497,16 @@ _eof_trans:
case 3: case 3:
#line 1 "NONE" #line 1 "NONE"
{te = p+1;} {te = p+1;}
#line 135 "hb-ot-shape-complex-use-machine.rl" #line 138 "hb-ot-shape-complex-use-machine.rl"
{act = 7;} {act = 7;}
break; break;
case 10: case 10:
#line 1 "NONE" #line 1 "NONE"
{te = p+1;} {te = p+1;}
#line 136 "hb-ot-shape-complex-use-machine.rl" #line 139 "hb-ot-shape-complex-use-machine.rl"
{act = 8;} {act = 8;}
break; break;
#line 470 "hb-ot-shape-complex-use-machine.hh" #line 510 "hb-ot-shape-complex-use-machine.hh"
} }
_again: _again:
@ -475,7 +515,7 @@ _again:
#line 1 "NONE" #line 1 "NONE"
{ts = 0;} {ts = 0;}
break; break;
#line 479 "hb-ot-shape-complex-use-machine.hh" #line 519 "hb-ot-shape-complex-use-machine.hh"
} }
if ( ++p != pe ) if ( ++p != pe )
@ -491,7 +531,7 @@ _again:
} }
#line 168 "hb-ot-shape-complex-use-machine.rl" #line 171 "hb-ot-shape-complex-use-machine.rl"
} }

View File

@ -88,13 +88,16 @@ SMAbv = 41; # SYM_MOD_ABOVE
SMBlw = 42; # SYM_MOD_BELOW SMBlw = 42; # SYM_MOD_BELOW
CS = 43; # CONS_WITH_STACKER CS = 43; # CONS_WITH_STACKER
HVM = 44; # HALANT_OR_VOWEL_MODIFIER
h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102
# Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729 # Override: Adhoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729
consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.H.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*;
# Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376 # Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376
medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?; medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
dependent_vowels = VPre* VAbv* VBlw* VPst*; dependent_vowels = VPre* VAbv* VBlw* VPst*;
vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*; vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*;
final_consonants = FAbv* FBlw* FPst* FM?; final_consonants = FAbv* FBlw* FPst* FM?;
complex_syllable_tail = complex_syllable_tail =
@ -108,7 +111,7 @@ complex_syllable_tail =
virama_terminated_cluster = virama_terminated_cluster =
(R|CS)? (B | GB) VS? (R|CS)? (B | GB) VS?
consonant_modifiers consonant_modifiers
ZWJ?.H.ZWJ? ZWJ?.h.ZWJ?
; ;
standard_cluster = standard_cluster =
(R|CS)? (B | GB) VS? (R|CS)? (B | GB) VS?

View File

@ -24,6 +24,7 @@
#define GB USE_GB /* BASE_OTHER */ #define GB USE_GB /* BASE_OTHER */
#define H USE_H /* HALANT */ #define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */ #define HN USE_HN /* HALANT_NUM */
#define HVM USE_HVM /* HALANT_OR_VOWEL_MODIFIER */
#define IND USE_IND /* BASE_IND */ #define IND USE_IND /* BASE_IND */
#define N USE_N /* BASE_NUM */ #define N USE_N /* BASE_NUM */
#define O USE_O /* OTHER */ #define O USE_O /* OTHER */
@ -508,7 +509,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, /* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw,
/* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O, /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, HVM, O, O, O, O, O, O, O, O, O,
/* 11050 */ O, O, N, N, N, N, N, N, N, N, N, N, N, N, N, N, /* 11050 */ O, O, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 11060 */ N, N, N, N, N, N, B, B, B, B, B, B, B, B, B, B, /* 11060 */ N, N, N, N, N, N, B, B, B, B, B, B, B, B, B, B,
/* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, HN, /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, HN,
@ -800,6 +801,7 @@ hb_use_get_category (hb_codepoint_t u)
#undef GB #undef GB
#undef H #undef H
#undef HN #undef HN
#undef HVM
#undef IND #undef IND
#undef N #undef N
#undef O #undef O

View File

@ -88,7 +88,10 @@ enum use_category_t {
USE_VMPre = 23, /* VOWEL_MOD_PRE */ USE_VMPre = 23, /* VOWEL_MOD_PRE */
USE_SMAbv = 41, /* SYM_MOD_ABOVE */ USE_SMAbv = 41, /* SYM_MOD_ABOVE */
USE_SMBlw = 42, /* SYM_MOD_BELOW */ USE_SMBlw = 42, /* SYM_MOD_BELOW */
USE_CS = 43 /* CONS_WITH_STACKER */ USE_CS = 43, /* CONS_WITH_STACKER */
/* https://github.com/harfbuzz/harfbuzz/issues/1102 */
USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */
}; };
HB_INTERNAL USE_TABLE_ELEMENT_TYPE HB_INTERNAL USE_TABLE_ELEMENT_TYPE

View File

@ -237,13 +237,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
return &_hb_ot_complex_shaper_hebrew; return &_hb_ot_complex_shaper_hebrew;
/* ^--- Add new shapers here */
#if 0
/* Unicode-4.1 additions */
case HB_SCRIPT_NEW_TAI_LUE:
#endif
/* Unicode-1.1 additions */ /* Unicode-1.1 additions */
case HB_SCRIPT_BENGALI: case HB_SCRIPT_BENGALI:
case HB_SCRIPT_DEVANAGARI: case HB_SCRIPT_DEVANAGARI:
@ -350,9 +343,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-8.0 additions */ /* Unicode-8.0 additions */
case HB_SCRIPT_AHOM: case HB_SCRIPT_AHOM:
//case HB_SCRIPT_MULTANI:
/* Unicode-9.0 additions */ /* Unicode-9.0 additions */
//case HB_SCRIPT_ADLAM:
case HB_SCRIPT_BHAIKSUKI: case HB_SCRIPT_BHAIKSUKI:
case HB_SCRIPT_MARCHEN: case HB_SCRIPT_MARCHEN:
case HB_SCRIPT_NEWA: case HB_SCRIPT_NEWA:
@ -365,7 +358,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-11.0 additions */ /* Unicode-11.0 additions */
case HB_SCRIPT_DOGRA: case HB_SCRIPT_DOGRA:
case HB_SCRIPT_GUNJALA_GONDI: case HB_SCRIPT_GUNJALA_GONDI:
//case HB_SCRIPT_HANIFI_ROHINGYA:
case HB_SCRIPT_MAKASAR: case HB_SCRIPT_MAKASAR:
//case HB_SCRIPT_SOGDIAN:
/* If the designer designed the font for the 'DFLT' script, /* If the designer designed the font for the 'DFLT' script,
* (or we ended up arbitrarily pick 'latn'), use the default shaper. * (or we ended up arbitrarily pick 'latn'), use the default shaper.

View File

@ -275,10 +275,39 @@ struct hb_ot_shape_context_t
static void static void
hb_set_unicode_props (hb_buffer_t *buffer) hb_set_unicode_props (hb_buffer_t *buffer)
{ {
/* Implement enough of Unicode Graphemes here that shaping
* in reverse-direction wouldn't break graphemes. Namely,
* we mark all marks and ZWJ and ZWJ,Extended_Pictographic
* sequences as continuations. The foreach_grapheme()
* macro uses this bit.
*
* https://www.unicode.org/reports/tr29/#Regex_Definitions
*/
unsigned int count = buffer->len; unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{
_hb_glyph_info_set_unicode_props (&info[i], buffer); _hb_glyph_info_set_unicode_props (&info[i], buffer);
/* Marks are already set as continuation by the above line.
* Handle Emoji_Modifier and ZWJ-continuation. */
if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
{
_hb_glyph_info_set_continuation (&info[i]);
}
else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
{
_hb_glyph_info_set_continuation (&info[i]);
if (i + 1 < count &&
_hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
{
i++;
_hb_glyph_info_set_unicode_props (&info[i], buffer);
_hb_glyph_info_set_continuation (&info[i]);
}
}
}
} }
static void static void
@ -286,8 +315,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
{ {
if (!(buffer->flags & HB_BUFFER_FLAG_BOT) || if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
buffer->context_len[0] || buffer->context_len[0] ||
_hb_glyph_info_get_general_category (&buffer->info[0]) != !_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
return; return;
if (!font->has_glyph (0x25CCu)) if (!font->has_glyph (0x25CCu))
@ -316,26 +344,12 @@ hb_form_clusters (hb_buffer_t *buffer)
if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII)) if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
return; return;
/* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
unsigned int base = 0;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 1; i < count; i++)
{
if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
!_hb_glyph_info_is_joiner (&info[i])))
{
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
buffer->merge_clusters (base, i); foreach_grapheme (buffer, start, end)
buffer->merge_clusters (start, end);
else else
buffer->unsafe_to_break (base, i); foreach_grapheme (buffer, start, end)
base = i; buffer->unsafe_to_break (start, end);
}
}
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
buffer->merge_clusters (base, count);
else
buffer->unsafe_to_break (base, count);
} }
static void static void
@ -353,25 +367,17 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
(HB_DIRECTION_IS_VERTICAL (direction) && (HB_DIRECTION_IS_VERTICAL (direction) &&
direction != HB_DIRECTION_TTB)) direction != HB_DIRECTION_TTB))
{ {
/* Same loop as hb_form_clusters().
* Since form_clusters() merged clusters already, we don't merge. */
unsigned int base = 0;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 1; i < count; i++)
{
if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i]))))
{
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
buffer->merge_clusters (base, i);
buffer->reverse_range (base, i);
base = i;
}
}
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS)
buffer->merge_clusters (base, count); foreach_grapheme (buffer, start, end)
buffer->reverse_range (base, count); {
buffer->merge_clusters (start, end);
buffer->reverse_range (start, end);
}
else
foreach_grapheme (buffer, start, end)
/* form_clusters() merged clusters already, we don't merge. */
buffer->reverse_range (start, end);
buffer->reverse (); buffer->reverse ();

View File

@ -177,7 +177,7 @@ struct fvar
v = (v - axis.default_value) / (axis.default_value - axis.min_value); v = (v - axis.default_value) / (axis.default_value - axis.min_value);
else else
v = (v - axis.default_value) / (axis.max_value - axis.default_value); v = (v - axis.default_value) / (axis.max_value - axis.default_value);
return (int) (v * 16384. + (v >= 0. ? .5 : -.5)); return (int) (v * 16384.f + (v >= 0.f ? .5f : -.5f));
} }
protected: protected:

View File

@ -0,0 +1,269 @@
/* == Start of generated table == */
/*
* The following tables are generated by running:
*
* ./gen-emoji-table.py emoji-data.txt
*
* on file with this header:
*
* # emoji-data.txt
* # Date: 2018-02-07, 07:55:18 GMT
* # © 2018 Unicode®, Inc.
* # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
* # For terms of use, see http://www.unicode.org/terms_of_use.html
* #
* # Emoji Data for UTS #51
* # Version: 11.0
* #
* # For documentation and usage, see http://www.unicode.org/reports/tr51
*/
#ifndef HB_UNICODE_EMOJI_TABLE_HH
#define HB_UNICODE_EMOJI_TABLE_HH
#include "hb-unicode.hh"
static const struct hb_unicode_range_t _hb_unicode_emoji_Extended_Pictographic_table[] =
{
{0x00A9, 0x00A9},
{0x00AE, 0x00AE},
{0x203C, 0x203C},
{0x2049, 0x2049},
{0x2122, 0x2122},
{0x2139, 0x2139},
{0x2194, 0x2199},
{0x21A9, 0x21AA},
{0x231A, 0x231B},
{0x2328, 0x2328},
{0x2388, 0x2388},
{0x23CF, 0x23CF},
{0x23E9, 0x23F3},
{0x23F8, 0x23FA},
{0x24C2, 0x24C2},
{0x25AA, 0x25AB},
{0x25B6, 0x25B6},
{0x25C0, 0x25C0},
{0x25FB, 0x25FE},
{0x2600, 0x2605},
{0x2607, 0x2612},
{0x2614, 0x2615},
{0x2616, 0x2617},
{0x2618, 0x2618},
{0x2619, 0x2619},
{0x261A, 0x266F},
{0x2670, 0x2671},
{0x2672, 0x267D},
{0x267E, 0x267F},
{0x2680, 0x2685},
{0x2690, 0x2691},
{0x2692, 0x269C},
{0x269D, 0x269D},
{0x269E, 0x269F},
{0x26A0, 0x26A1},
{0x26A2, 0x26B1},
{0x26B2, 0x26B2},
{0x26B3, 0x26BC},
{0x26BD, 0x26BF},
{0x26C0, 0x26C3},
{0x26C4, 0x26CD},
{0x26CE, 0x26CE},
{0x26CF, 0x26E1},
{0x26E2, 0x26E2},
{0x26E3, 0x26E3},
{0x26E4, 0x26E7},
{0x26E8, 0x26FF},
{0x2700, 0x2700},
{0x2701, 0x2704},
{0x2705, 0x2705},
{0x2708, 0x2709},
{0x270A, 0x270B},
{0x270C, 0x2712},
{0x2714, 0x2714},
{0x2716, 0x2716},
{0x271D, 0x271D},
{0x2721, 0x2721},
{0x2728, 0x2728},
{0x2733, 0x2734},
{0x2744, 0x2744},
{0x2747, 0x2747},
{0x274C, 0x274C},
{0x274E, 0x274E},
{0x2753, 0x2755},
{0x2757, 0x2757},
{0x2763, 0x2767},
{0x2795, 0x2797},
{0x27A1, 0x27A1},
{0x27B0, 0x27B0},
{0x27BF, 0x27BF},
{0x2934, 0x2935},
{0x2B05, 0x2B07},
{0x2B1B, 0x2B1C},
{0x2B50, 0x2B50},
{0x2B55, 0x2B55},
{0x3030, 0x3030},
{0x303D, 0x303D},
{0x3297, 0x3297},
{0x3299, 0x3299},
{0x1F000, 0x1F02B},
{0x1F02C, 0x1F02F},
{0x1F030, 0x1F093},
{0x1F094, 0x1F09F},
{0x1F0A0, 0x1F0AE},
{0x1F0AF, 0x1F0B0},
{0x1F0B1, 0x1F0BE},
{0x1F0BF, 0x1F0BF},
{0x1F0C0, 0x1F0C0},
{0x1F0C1, 0x1F0CF},
{0x1F0D0, 0x1F0D0},
{0x1F0D1, 0x1F0DF},
{0x1F0E0, 0x1F0F5},
{0x1F0F6, 0x1F0FF},
{0x1F10D, 0x1F10F},
{0x1F12F, 0x1F12F},
{0x1F16C, 0x1F16F},
{0x1F170, 0x1F171},
{0x1F17E, 0x1F17E},
{0x1F17F, 0x1F17F},
{0x1F18E, 0x1F18E},
{0x1F191, 0x1F19A},
{0x1F1AD, 0x1F1E5},
{0x1F201, 0x1F202},
{0x1F203, 0x1F20F},
{0x1F21A, 0x1F21A},
{0x1F22F, 0x1F22F},
{0x1F232, 0x1F23A},
{0x1F23C, 0x1F23F},
{0x1F249, 0x1F24F},
{0x1F250, 0x1F251},
{0x1F252, 0x1F25F},
{0x1F260, 0x1F265},
{0x1F266, 0x1F2FF},
{0x1F300, 0x1F320},
{0x1F321, 0x1F32C},
{0x1F32D, 0x1F32F},
{0x1F330, 0x1F335},
{0x1F336, 0x1F336},
{0x1F337, 0x1F37C},
{0x1F37D, 0x1F37D},
{0x1F37E, 0x1F37F},
{0x1F380, 0x1F393},
{0x1F394, 0x1F39F},
{0x1F3A0, 0x1F3C4},
{0x1F3C5, 0x1F3C5},
{0x1F3C6, 0x1F3CA},
{0x1F3CB, 0x1F3CE},
{0x1F3CF, 0x1F3D3},
{0x1F3D4, 0x1F3DF},
{0x1F3E0, 0x1F3F0},
{0x1F3F1, 0x1F3F7},
{0x1F3F8, 0x1F3FA},
{0x1F400, 0x1F43E},
{0x1F43F, 0x1F43F},
{0x1F440, 0x1F440},
{0x1F441, 0x1F441},
{0x1F442, 0x1F4F7},
{0x1F4F8, 0x1F4F8},
{0x1F4F9, 0x1F4FC},
{0x1F4FD, 0x1F4FE},
{0x1F4FF, 0x1F4FF},
{0x1F500, 0x1F53D},
{0x1F546, 0x1F54A},
{0x1F54B, 0x1F54F},
{0x1F550, 0x1F567},
{0x1F568, 0x1F579},
{0x1F57A, 0x1F57A},
{0x1F57B, 0x1F5A3},
{0x1F5A4, 0x1F5A4},
{0x1F5A5, 0x1F5FA},
{0x1F5FB, 0x1F5FF},
{0x1F600, 0x1F600},
{0x1F601, 0x1F610},
{0x1F611, 0x1F611},
{0x1F612, 0x1F614},
{0x1F615, 0x1F615},
{0x1F616, 0x1F616},
{0x1F617, 0x1F617},
{0x1F618, 0x1F618},
{0x1F619, 0x1F619},
{0x1F61A, 0x1F61A},
{0x1F61B, 0x1F61B},
{0x1F61C, 0x1F61E},
{0x1F61F, 0x1F61F},
{0x1F620, 0x1F625},
{0x1F626, 0x1F627},
{0x1F628, 0x1F62B},
{0x1F62C, 0x1F62C},
{0x1F62D, 0x1F62D},
{0x1F62E, 0x1F62F},
{0x1F630, 0x1F633},
{0x1F634, 0x1F634},
{0x1F635, 0x1F640},
{0x1F641, 0x1F642},
{0x1F643, 0x1F644},
{0x1F645, 0x1F64F},
{0x1F680, 0x1F6C5},
{0x1F6C6, 0x1F6CF},
{0x1F6D0, 0x1F6D0},
{0x1F6D1, 0x1F6D2},
{0x1F6D3, 0x1F6D4},
{0x1F6D5, 0x1F6DF},
{0x1F6E0, 0x1F6EC},
{0x1F6ED, 0x1F6EF},
{0x1F6F0, 0x1F6F3},
{0x1F6F4, 0x1F6F6},
{0x1F6F7, 0x1F6F8},
{0x1F6F9, 0x1F6F9},
{0x1F6FA, 0x1F6FF},
{0x1F774, 0x1F77F},
{0x1F7D5, 0x1F7D8},
{0x1F7D9, 0x1F7FF},
{0x1F80C, 0x1F80F},
{0x1F848, 0x1F84F},
{0x1F85A, 0x1F85F},
{0x1F888, 0x1F88F},
{0x1F8AE, 0x1F8FF},
{0x1F90C, 0x1F90F},
{0x1F910, 0x1F918},
{0x1F919, 0x1F91E},
{0x1F91F, 0x1F91F},
{0x1F920, 0x1F927},
{0x1F928, 0x1F92F},
{0x1F930, 0x1F930},
{0x1F931, 0x1F932},
{0x1F933, 0x1F93A},
{0x1F93C, 0x1F93E},
{0x1F93F, 0x1F93F},
{0x1F940, 0x1F945},
{0x1F947, 0x1F94B},
{0x1F94C, 0x1F94C},
{0x1F94D, 0x1F94F},
{0x1F950, 0x1F95E},
{0x1F95F, 0x1F96B},
{0x1F96C, 0x1F970},
{0x1F971, 0x1F972},
{0x1F973, 0x1F976},
{0x1F977, 0x1F979},
{0x1F97A, 0x1F97A},
{0x1F97B, 0x1F97B},
{0x1F97C, 0x1F97F},
{0x1F980, 0x1F984},
{0x1F985, 0x1F991},
{0x1F992, 0x1F997},
{0x1F998, 0x1F9A2},
{0x1F9A3, 0x1F9AF},
{0x1F9B0, 0x1F9B9},
{0x1F9BA, 0x1F9BF},
{0x1F9C0, 0x1F9C0},
{0x1F9C1, 0x1F9C2},
{0x1F9C3, 0x1F9CF},
{0x1F9D0, 0x1F9E6},
{0x1F9E7, 0x1F9FF},
{0x1FA00, 0x1FA5F},
{0x1FA60, 0x1FA6D},
{0x1FA6E, 0x1FFFD},
};
#endif /* HB_UNICODE_EMOJI_TABLE_HH */
/* == End of generated table == */

View File

@ -564,3 +564,19 @@ _hb_modified_combining_class[256] =
241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255, /* HB_UNICODE_COMBINING_CLASS_INVALID */ 255, /* HB_UNICODE_COMBINING_CLASS_INVALID */
}; };
/*
* Emoji
*/
#include "hb-unicode-emoji-table.hh"
bool
_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
{
return hb_bsearch_r (&cp, _hb_unicode_emoji_Extended_Pictographic_table,
ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table),
sizeof (hb_unicode_range_t),
hb_unicode_range_t::cmp, nullptr);
}

View File

@ -101,26 +101,6 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
return ret; return ret;
} }
inline hb_unicode_general_category_t
modified_general_category (hb_codepoint_t u)
{
hb_unicode_general_category_t cat = general_category (u);
if (unlikely (cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL))
{
/* Recategorize emoji skin-tone modifiers as Unicode mark, so they
* behave correctly in non-native directionality. They originally
* are MODIFIER_SYMBOL. Fixes:
* https://github.com/harfbuzz/harfbuzz/issues/169
*/
if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1F3FBu, 0x1F3FFu)))
cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
}
return cat;
}
inline unsigned int inline unsigned int
modified_combining_class (hb_codepoint_t u) modified_combining_class (hb_codepoint_t u)
{ {
@ -286,7 +266,9 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
/* Modified combining marks */ /*
* Modified combining marks
*/
/* Hebrew /* Hebrew
* *
@ -379,9 +361,37 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK(gen_cat) \
(FLAG_UNSAFE (gen_cat) & \ /*
(FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ * Ranges, used for bsearch tables.
FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) */
struct hb_unicode_range_t
{
static int
cmp (const void *_key, const void *_item, void *_arg)
{
hb_codepoint_t cp = *((hb_codepoint_t *) _key);
const hb_unicode_range_t *range = (hb_unicode_range_t *) _item;
if (cp < range->start)
return -1;
else if (cp <= range->end)
return 0;
else
return +1;
}
hb_codepoint_t start;
hb_codepoint_t end;
};
/*
* Emoji.
*/
HB_INTERNAL bool
_hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp);
#endif /* HB_UNICODE_HH */ #endif /* HB_UNICODE_HH */

View File

@ -31,10 +31,10 @@
static void static void
test (hb_codepoint_t cp, unsigned int bit) test (hb_codepoint_t cp, unsigned int bit)
{ {
if (OT::hb_get_unicode_range_bit (cp) != bit) if (OT::_hb_ot_os2_get_unicode_range_bit (cp) != bit)
{ {
fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.", fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.",
OT::hb_get_unicode_range_bit (cp), OT::_hb_ot_os2_get_unicode_range_bit (cp),
cp, cp,
bit); bit);
abort(); abort();

View File

@ -51,13 +51,18 @@ static inline hb_face_t *
hb_subset_test_open_font (const char *font_path) hb_subset_test_open_font (const char *font_path)
{ {
#if GLIB_CHECK_VERSION(2,37,2) #if GLIB_CHECK_VERSION(2,37,2)
char* path = g_test_build_filename (G_TEST_DIST, font_path, NULL); char *path = g_test_build_filename (G_TEST_DIST, font_path, NULL);
#else #else
char* path = g_strdup (font_path); char *path = g_strdup (font_path);
#endif #endif
hb_blob_t* blob = hb_blob_create_from_file (path); hb_blob_t *blob = hb_blob_create_from_file (path);
hb_face_t* face = hb_face_create (blob, 0); if (hb_blob_get_length (blob) == 0)
{
printf ("The test font is not found.");
exit (1);
}
hb_face_t *face = hb_face_create (blob, 0);
hb_blob_destroy (blob); hb_blob_destroy (blob);
g_free (path); g_free (path);

View File

@ -32,16 +32,10 @@
#include <hb.h> #include <hb.h>
#include <hb-ft.h> #include <hb-ft.h>
#include <hb-ot.h> #include <hb-ot.h>
#include <glib.h>
static const char *text = "طرح‌نَما"; static char *font_path = "fonts/Inconsolata-Regular.abc.ttf";
static const char *path = static char *text = "abc";
#if defined(__linux__)
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
#elif defined(_WIN32) || defined(_WIN64)
"C:\\Windows\\Fonts\\tahoma.ttf";
#elif __APPLE__
"/Library/Fonts/Tahoma.ttf";
#endif
static int num_threads = 30; static int num_threads = 30;
static int num_iters = 200; static int num_iters = 200;
@ -54,7 +48,7 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static void static void
fill_the_buffer (hb_buffer_t *buffer) fill_the_buffer (hb_buffer_t *buffer)
{ {
hb_buffer_add_utf8 (buffer, text, sizeof (text), 0, sizeof (text)); hb_buffer_add_utf8 (buffer, text, -1, 0, -1);
hb_buffer_guess_segment_properties (buffer); hb_buffer_guess_segment_properties (buffer);
hb_shape (font, buffer, NULL, 0); hb_shape (font, buffer, NULL, 0);
} }
@ -133,16 +127,33 @@ test_body (void)
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
if (argc > 1) g_test_init (&argc, &argv, NULL);
num_threads = atoi (argv[1]);
#if GLIB_CHECK_VERSION(2,37,2)
gchar *default_path = g_test_build_filename (G_TEST_DIST, font_path, NULL);
#else
gchar *default_path = g_strdup (font_path);
#endif
char *path = argc > 1 ? argv[1] : (char *) default_path;
if (argc > 2) if (argc > 2)
num_iters = atoi (argv[2]); num_threads = atoi (argv[2]);
if (argc > 3)
num_iters = atoi (argv[3]);
if (argc > 4)
text = argv[4];
// Dummy call to alleviate _guess_segment_properties thread safety-ness // Dummy call to alleviate _guess_segment_properties thread safety-ness
// https://github.com/harfbuzz/harfbuzz/issues/1191 // https://github.com/harfbuzz/harfbuzz/issues/1191
hb_language_get_default (); hb_language_get_default ();
hb_blob_t *blob = hb_blob_create_from_file (path); hb_blob_t *blob = hb_blob_create_from_file (path);
if (hb_blob_get_length (blob) == 0)
{
printf ("The test font is not found.");
return 1;
}
hb_face_t *face = hb_face_create (blob, 0); hb_face_t *face = hb_face_create (blob, 0);
font = hb_font_create (face); font = hb_font_create (face);
@ -165,5 +176,7 @@ main (int argc, char **argv)
hb_face_destroy (face); hb_face_destroy (face);
hb_blob_destroy (blob); hb_blob_destroy (blob);
g_free (default_path);
return 0; return 0;
} }

View File

@ -1,12 +1,18 @@
#include "hb-fuzzer.hh" #include "hb-fuzzer.hh"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <assert.h> #include <assert.h>
int main(int argc, char **argv) { int main(int argc, char **argv) {
hb_blob_t *blob = hb_blob_create_from_file (argv[1]); hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
unsigned int len; unsigned int len;
const char *font_data = hb_blob_get_data (blob, &len); const char *font_data = hb_blob_get_data (blob, &len);
if (len == 0)
{
printf ("The test font is not found.");
exit (1);
}
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
printf ("%s\n", argv[i]); printf ("%s\n", argv[i]);

View File

@ -12,7 +12,7 @@ TESTS = \
tests/context-matching.tests \ tests/context-matching.tests \
tests/cursive-positioning.tests \ tests/cursive-positioning.tests \
tests/default-ignorables.tests \ tests/default-ignorables.tests \
tests/emoji-flag-tags.tests \ tests/emoji.tests \
tests/fallback-positioning.tests \ tests/fallback-positioning.tests \
tests/fuzzed.tests \ tests/fuzzed.tests \
tests/hangul-jamo.tests \ tests/hangul-jamo.tests \
@ -27,6 +27,7 @@ TESTS = \
tests/indic-script-extensions.tests \ tests/indic-script-extensions.tests \
tests/indic-special-cases.tests \ tests/indic-special-cases.tests \
tests/indic-syllable.tests \ tests/indic-syllable.tests \
tests/indic-vowel-letter-spoofing.tests \
tests/khmer-mark-order.tests \ tests/khmer-mark-order.tests \
tests/khmer-misc.tests \ tests/khmer-misc.tests \
tests/language-tags.tests \ tests/language-tags.tests \

View File

@ -1,2 +0,0 @@
../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0]
../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]

View File

@ -0,0 +1,4 @@
../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0]
../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]
../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=l:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]
../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=r:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]

View File

@ -1,2 +1,2 @@
../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450] ../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450]
../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=0+0|candrabinduorya=0+0] ../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=1+0|candrabinduorya=1+0]

View File

@ -1,6 +1,6 @@
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=1+0|uni17ca=1+0|uni17b8=1@0,300+0|space=7+600] ../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0] ../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni093F.750=3+397|uni092F=3+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924]
../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=3+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924]
../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]

View File

@ -0,0 +1,53 @@
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0904,U+0020,U+0905,U+0946:[ashortdeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|eshortvowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0906,U+0020,U+0905,U+093E:[aadeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|aavowelsigndeva=2+259]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0908,U+0020,U+0930,U+094D,U+0907:[iideva=0+491|space=1+260|uni25CC=2+510|rephdeva=2+0|ideva=2+491]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090A,U+0020,U+0909,U+0941:[uudeva=0+765|space=1+260|udeva=2+548|uni25CC=2+510|uvowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090D,U+0020,U+090F,U+0945:[ecandradeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|ecandravowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090E,U+0020,U+090F,U+0946:[eshortdeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|eshortvowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0910,U+0020,U+090F,U+0947:[aideva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|evowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0911,U+0020,U+0905,U+0949,U+0020,U+0906,U+0945:[ocandradeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ocandravowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|ecandravowelsigndeva=5+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0912,U+0020,U+0905,U+094A,U+0020,U+0906,U+0946:[oshortdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|oshortvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|eshortvowelsigndeva=5+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0913,U+0020,U+0905,U+094B,U+0020,U+0906,U+0947:[odeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ovowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|evowelsigndeva=5+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0914,U+0020,U+0905,U+094C,U+0020,U+0906,U+0948:[audeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|auvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|aivowelsigndeva=5+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0972,U+0020,U+0905,U+0945:[acandradeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|ecandravowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0973,U+0020,U+0905,U+093A:[oedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|oevowelsigndeva=2+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0974,U+0020,U+0905,U+093B,U+0020,U+0906,U+093A:[ooedeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ooevowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|oevowelsigndeva=5+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0975,U+0020,U+0905,U+094F:[awdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|awvowelsigndeva=2+259]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0976,U+0020,U+0905,U+0956:[uedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uevowelsigndeva=2@50,0+0]
../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0977,U+0020,U+0905,U+0957:[uuedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uuevowelsigndeva=2@50,0+0]
../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+0986,U+0020,U+0985,U+09BE:[aabeng=0+1158|space=1+260|abeng=2+893|uni25CC=2+510|aavowelsignbeng=2+266]
../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E0,U+0020,U+098B,U+09C3:[rrvocalicbeng=0+853|space=1+260|rvocalicbeng=2+853|uni25CC=2+510|rvocalicvowelsignbeng=2+0]
../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E1,U+0020,U+098C,U+09E2:[llvocalicbeng=0+639|space=1+260|lvocalicbeng=2+639|uni25CC=2+510|lvocalicvowelsignbeng=2+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A06,U+0020,U+0A05,U+0A3E:[aaguru=0+2001|space=1+532|aguru=2+1520|uni25CC=2+1044|aamatraguru=2+481]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A07,U+0020,U+0A72,U+0A3F:[iguru=0+1671|space=1+532|iriguru=2+1141|imatraguru=2+530|uni25CC=2+1044]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A08,U+0020,U+0A72,U+0A40:[iiguru=0+1671|space=1+532|iriguru=2+1141|uni25CC=2+1044|iimatraguru=2+530]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A09,U+0020,U+0A73,U+0A41:[uguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|umatraguru=2@102,0+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0A,U+0020,U+0A73,U+0A42:[uuguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|uumatraguru=2@102,0+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0F,U+0020,U+0A72,U+0A47:[eeguru=0+1141|space=1+532|iriguru=2+1141|uni25CC=2+1044|eematraguru=2+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A10,U+0020,U+0A05,U+0A48:[aiguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aimatraguru=2+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A13,U+0020,U+0A73,U+0A4B:[ooguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|oomatraguru=2+0]
../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A14,U+0020,U+0A05,U+0A4C:[auguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aumatraguru=2+0]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A86,U+0020,U+0A85,U+0ABE:[gid3=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid10=2+543]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8D,U+0020,U+0A85,U+0AC5:[gid4=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid11=2+0]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8F,U+0020,U+0A85,U+0AC7:[gid5=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid12=2+0]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A90,U+0020,U+0A85,U+0AC8:[gid6=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid13=2+0]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A91,U+0020,U+0A85,U+0AC9:[gid7=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid14=2+543]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A93,U+0020,U+0A85,U+0ACB,U+0020,U+0A85,U+0ABE,U+0AC5:[gid8=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid15=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid11=5+0|gid10=5+543]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A94,U+0020,U+0A85,U+0ACC,U+0020,U+0A85,U+0ABE,U+0AC8:[gid9=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid16=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid13=5+0|gid10=5+543]
../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0AC9,U+0020,U+0AC5,U+0ABE:[gid17=0+1044|gid14=0+543|gid1=1+612|gid17=1+1044|gid11=1+0|gid17=1+1044|gid10=1+543]
../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B06,U+0020,U+0B05,U+0B3E:[aaorya=0+1681|space=1+881|aorya=2+1284|uni25CC=2+1044|aavowelsignorya=2+387]
../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B10,U+0020,U+0B0F,U+0B57:[aiorya=0+1681|space=1+881|eorya=2+1315|uni25CC=2+1044|aulengthmarkorya=2+387]
../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B14,U+0020,U+0B13,U+0B57:[auorya=0+1679|space=1+881|oorya=2+1309|uni25CC=2+1044|aulengthmarkorya=2+387]
../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C13,U+0020,U+0C12,U+0C55:[gid3=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid12=2+0]
../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C14,U+0020,U+0C12,U+0C4C:[gid4=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid11=2+634]
../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C40,U+0020,U+0C3F,U+0C55:[gid13=0+1184|gid6=0+0|gid1=1+580|gid13=1+1184|gid5=1+0|gid13=1+1184|gid12=1+0]
../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C47,U+0020,U+0C46,U+0C55:[gid13=0+1184|gid8=0+0|gid1=1+580|gid13=1+1184|gid7=1+0|gid13=1+1184|gid12=1+0]
../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C4B,U+0020,U+0C4A,U+0C55:[gid13=0+1184|gid10=0+634|gid1=1+580|gid13=1+1184|gid9=1+634|gid13=1+1184|gid12=1+0]
../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C8A,U+0020,U+0C89,U+0CBE:[gid3=0+3269|gid1=1+590|gid2=2+2502|gid10=2+1184|gid7=2+919]
../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C94,U+0020,U+0C92,U+0CCC:[gid6=0+1596|gid1=1+590|gid5=2+1590|gid10=2+1184|gid8=2+880]
../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0CE0,U+0020,U+0C8B,U+0CBE:[gid9=0+3214|gid1=1+590|gid4=2+2440|gid10=2+1184|gid7=2+919]
../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D08,U+0020,U+0D07,U+0D57:[gid3=0+3574|gid1=1+632|gid2=2+2019|gid14=2+1184|gid13=2+1555]
../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D0A,U+0020,U+0D09,U+0D57:[gid5=0+2972|gid1=1+632|gid4=2+1417|gid14=2+1184|gid13=2+1555]
../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D10,U+0020,U+0D0E,U+0D46:[gid7=0+4073|gid1=1+632|gid6=2+2608|gid12=2+1465|gid14=2+1184]
../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D13,U+0020,U+0D12,U+0D3E:[gid9=0+2557|gid1=1+632|gid8=2+1524|gid14=2+1184|gid11=2+1033]
../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D14,U+0020,U+0D12,U+0D57:[gid10=0+3073|gid1=1+632|gid8=2+1524|gid14=2+1184|gid13=2+1555]

View File

@ -1,4 +1,19 @@
../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750] ../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199] ../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199]
../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837,U+0020,U+182D,U+182D,U+180B,U+0020,U+182D,U+180C,U+0020,U+182D,U+180D,U+200D,U+0020,U+182D,U+200D,U+182D,U+180B,U+200D,U+0020,U+182D,U+180C,U+200D,U+0020,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D,U+0020,U+200D,U+182D,U+180C,U+200D,U+0020,U+200D,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+182D,U+180B,U+0020,U+200D,U+182D,U+180C,U+0020,U+1820,U+200C,U+182D,U+1820,U+1837,U+0020,U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D,U+0020,U+200D,U+182D,U+1824,U+182F,U+1822,U+0020,U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750|space=11+500|uni182D.E8E2_g.init=12+1000|uni182D.E8E8_g.fina1=13+1250|space=15+500|uni182D.EA1B_g.isol2=16+1000|space=18+500|uni182D.EA1E_g.init3=19+650|space=19+0|space=22+500|uni182D.E8E2_g.init=23+1000|space=23+0|uni182D.E8E5_g.medi1=25+800|space=25+0|space=28+500|uni182D.EA1D_g.init2=29+950|space=29+0|space=32+500|uni182D.EA1E_g.init3=33+650|space=33+0|space=36+500|space=36+0|uni182D.E8E4_g.medi=38+800|space=38+0|space=38+0|uni182D.E8E5_g.medi1=41+800|space=41+0|space=44+500|space=44+0|uni182D.E8E6_g.medi2=46+650|space=46+0|space=49+500|space=49+0|uni182D.E8E6_g.medi2=51+650|space=51+0|space=54+500|space=54+0|uni182D.E8E4_g.medi=56+800|space=56+0|uni182D.E8E8_g.fina1=58+1250|space=60+500|space=60+0|uni182D.E8E9_g.fina2=62+1050|space=64+500|uni1820.E820_a.isol=65+1550|space=65+0|uni182D.E8E2_g.init=67+1000|uni1820.E823_a.medi=68+400|uni1837.E931_r.fina=69+750|space=70+500|uni1830.E90B_s.init=71+850|uni1824.E844_u.medi=72+600|uni1837.E930_r.medi=73+600|space=73+0|space=73+0|uni182D.E8E5_g.medi1=76+800|uni1820.E823_a.medi=77+400|space=77+0|space=79+500|space=79+0|uni182D.E8E5_g.medi1=81+800|uni1824.E844_u.medi=82+600|uni182F.E908_l.medi=83+400|uni1822.E837_i.fina=84+600|space=85+500|uni182A1820.E875_ba.init=86+1000|uni1822.E836_i.medi2=88+1000|uni182D.E8E8_g.fina1=89+1250|space=90+0|uni1820.E827_a.fina2=91+600|uni202F.nobreak=92+500|uni1836.E92B_y.init1=93+500|uni1822.E834_i.medi=94+500|uni1828.E866_n.fina=95+850]
../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268] ../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+182D,U+180B:[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C:[uni182D.EA1B_g.isol2=0+1000]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+200D,U+182D,U+180B,U+200D:[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C,U+200D:[uni182D.EA1D_g.init2=0+950|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180D,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+182D,U+180B:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C:[space=0+0|uni182D.E8E9_g.fina2=1+1050]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1820,U+200C,U+182D,U+1820,U+1837:[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D:[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+1824,U+182F,U+1822:[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|space=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850]

View File

@ -6,3 +6,6 @@
../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210] ../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210]
../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401] ../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401]
../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834] ../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834]
../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11042,U+11046:[brm_KA=0+754|brm_vowelEE=0@-383,0+0|brm_virama=0@-524,0+0]
../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11044,U+11046:[brm_KA=0+754|brm_vowelOO=0@-647,0+0|brm_virama=0@-524,0+0]
../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+1103C:[brm_KA=0+754|brm_vowelU=0@-403,0+0]