Merge branch 'master' into cff-subset
This commit is contained in:
commit
8be5a9186b
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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, :)
|
||||||
|
@ -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)) \
|
||||||
|
@ -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 \
|
||||||
|
@ -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
64
src/gen-emoji-table.py
Executable 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 == */")
|
@ -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:]
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
**/
|
**/
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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,7 +357,8 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
|
|||||||
buffer->merge_out_clusters (start - 1, end);
|
buffer->merge_out_clusters (start - 1, end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffer->swap_buffers ();
|
if (likely (buffer->successful))
|
||||||
|
buffer->swap_buffers ();
|
||||||
|
|
||||||
/* If font has Thai GSUB, we are done. */
|
/* If font has Thai GSUB, we are done. */
|
||||||
if (plan->props.script == HB_SCRIPT_THAI && !plan->map.found_script[0])
|
if (plan->props.script == HB_SCRIPT_THAI && !plan->map.found_script[0])
|
||||||
|
@ -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"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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?
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
|
||||||
buffer->merge_clusters (base, i);
|
|
||||||
else
|
|
||||||
buffer->unsafe_to_break (base, i);
|
|
||||||
base = 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, count);
|
foreach_grapheme (buffer, start, end)
|
||||||
|
buffer->merge_clusters (start, end);
|
||||||
else
|
else
|
||||||
buffer->unsafe_to_break (base, count);
|
foreach_grapheme (buffer, start, end)
|
||||||
|
buffer->unsafe_to_break (start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 ();
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
269
src/hb-unicode-emoji-table.hh
Normal file
269
src/hb-unicode-emoji-table.hh
Normal 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 == */
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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]);
|
||||||
|
@ -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 \
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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]
|
|
4
test/shaping/data/in-house/tests/emoji.tests
Normal file
4
test/shaping/data/in-house/tests/emoji.tests
Normal 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]
|
@ -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]
|
||||||
|
@ -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]
|
||||||
|
@ -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]
|
@ -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]
|
||||||
|
@ -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]
|
||||||
|
Loading…
Reference in New Issue
Block a user