Merge branch 'master' into cff-subset

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

View File

@ -91,7 +91,7 @@ jobs:
- run: apt update || true
- run: apt 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: 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 check CPPFLAGS="-Werror" || .ci/fail.sh

View File

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

View File

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

View File

@ -289,13 +289,15 @@ harfbuzz-gobject.def: $(HB_GOBJECT_headers)
GENERATORS = \
gen-arabic-table.py \
gen-indic-table.py \
gen-use-table.py \
gen-def.py \
gen-emoji-table.py \
gen-indic-table.py \
gen-os2-unicode-ranges.py \
gen-use-table.py \
$(NULL)
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
$(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 \
|| ($(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)
.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 = \
$(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \

View File

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

View File

@ -146,7 +146,7 @@ static void colr_cpal_rendering (cairo_font_face_t *cairo_face, unsigned int upe
int r = (color >> 8) & 0xFF;
int g = (color >> 16) & 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;
glyph.index = glyph_id;

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

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

View File

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

View File

@ -197,7 +197,10 @@ def is_CONS_SUB(U, UISC, UGC):
def is_CONS_WITH_STACKER(U, UISC, UGC):
return UISC == Consonant_With_Stacker
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):
return UISC == Number_Joiner
def is_ZWNJ(U, UISC, UGC):
@ -248,6 +251,7 @@ use_mapping = {
'SUB': is_CONS_SUB,
'CS': is_CONS_WITH_STACKER,
'H': is_HALANT,
'HVM': is_HALANT_OR_VOWEL_MODIFIER,
'HN': is_HALANT_NUM,
'ZWNJ': is_ZWNJ,
'ZWJ': is_ZWJ,
@ -295,6 +299,7 @@ use_positions = {
'Blw': [Bottom],
},
'H': None,
'HVM': None,
'B': None,
'FM': None,
'SUB': None,

View File

@ -369,37 +369,6 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
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
hb_buffer_t::move_to (unsigned int i)
{
@ -442,19 +411,6 @@ hb_buffer_t::move_to (unsigned int i)
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
hb_buffer_t::set_masks (hb_mask_t value,

View File

@ -212,13 +212,46 @@ struct hb_buffer_t
unsigned int num_out,
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 */
HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index);
HB_INTERNAL void output_info (const hb_glyph_info_t &glyph_info);
inline hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
{
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 */
HB_INTERNAL void copy_glyph (void);
HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
inline void copy_glyph (void)
{
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.
* If there's no output, just advance idx. */
inline void
@ -235,10 +268,11 @@ struct hb_buffer_t
idx++;
}
/* 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)
{
for (unsigned int j = 0; j < len; j++)
@ -275,6 +309,8 @@ struct hb_buffer_t
/* Internal methods */
HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
HB_INTERNAL bool enlarge (unsigned int size);
inline bool ensure (unsigned int size)

View File

@ -1072,7 +1072,7 @@ hb_variation_to_string (hb_variation_t *variation,
while (len && s[len - 1] == ' ')
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));
len = MIN (len, size - 1);

View File

@ -626,7 +626,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
/* 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,
* 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

View File

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

View File

@ -95,6 +95,32 @@ retry:
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_shaper_face_data_create (hb_face_t *face)
{
@ -113,7 +139,7 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face)
return nullptr;
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)) {
free (data);

View File

@ -160,12 +160,12 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font,
#define foreach_syllable(buffer, start, end) \
for (unsigned int \
_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 = end, end = _next_syllable (buffer, start))
start = end, end = _hb_next_syllable (buffer, start))
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;
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,
* CGJ, or other characters that are hidden but should not be ignored
* 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:
* - 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 {
UPROPS_MASK_GEN_CAT = 0x001Fu,
UPROPS_MASK_IGNORABLE = 0x0020u,
UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3,
* or TAG characters */
UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, or TAG characters */
UPROPS_MASK_CONTINUATION=0x0080u,
/* If GEN_CAT=FORMAT, top byte masks: */
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)
{
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
if (unlikely (unicode->is_default_ignorable (u)))
{
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;
}
}
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:
* https://unicode.org/policies/stability_policy.html#Property_Value
* """
* 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".
*/
if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
{
props |= UPROPS_MASK_CONTINUATION;
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;
}
/* 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)))
static inline bool
@ -369,6 +333,41 @@ _hb_glyph_info_unhide (hb_glyph_info_t *info)
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
_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
{

View File

@ -81,7 +81,7 @@ struct os2
hb_codepoint_t cp = HB_SET_VALUE_INVALID;
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)
{
unsigned int block = bit / 32;

View File

@ -31,14 +31,29 @@
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 end;
unsigned int bit;
};
/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */
static Range os2UnicodeRangesSorted[] =
/* Note: The contents of this array was generated using gen-os2-unicode-ranges.py. */
static const OS2Range _hb_os2_unicode_ranges[] =
{
{ 0x0, 0x7F, 0}, // Basic Latin
{ 0x80, 0xFF, 1}, // Latin-1 Supplement
@ -211,31 +226,17 @@ static Range os2UnicodeRangesSorted[] =
{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:
* Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint.
* _hb_ot_os2_get_unicode_range_bit:
* Returns the bit to be set in os/2 ulUnicodeOS2Range for a given codepoint.
**/
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,
sizeof (os2UnicodeRangesSorted) / sizeof(Range),
sizeof(Range),
_compare_range, nullptr);
OS2Range *range = (OS2Range*) hb_bsearch_r (&cp, _hb_os2_unicode_ranges,
ARRAY_LENGTH (_hb_os2_unicode_ranges),
sizeof (OS2Range),
OS2Range::cmp, nullptr);
if (range != nullptr)
return range->bit;
return -1;

View File

@ -331,6 +331,275 @@ data_destroy_indic (void *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
consonant_position_from_face (const indic_shape_plan_t *indic_plan,
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_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;
unsigned int count = buffer->len;
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,
data_create_indic,
data_destroy_indic,
nullptr, /* preprocess_text */
preprocess_text_indic,
nullptr, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
decompose_indic,

View File

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

View File

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

View File

@ -88,13 +88,16 @@ SMAbv = 41; # SYM_MOD_ABOVE
SMBlw = 42; # SYM_MOD_BELOW
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
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
medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?;
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?;
complex_syllable_tail =
@ -108,7 +111,7 @@ complex_syllable_tail =
virama_terminated_cluster =
(R|CS)? (B | GB) VS?
consonant_modifiers
ZWJ?.H.ZWJ?
ZWJ?.h.ZWJ?
;
standard_cluster =
(R|CS)? (B | GB) VS?

View File

@ -24,6 +24,7 @@
#define GB USE_GB /* BASE_OTHER */
#define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */
#define HVM USE_HVM /* HALANT_OR_VOWEL_MODIFIER */
#define IND USE_IND /* BASE_IND */
#define N USE_N /* BASE_NUM */
#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,
/* 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,
/* 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,
/* 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,
@ -800,6 +801,7 @@ hb_use_get_category (hb_codepoint_t u)
#undef GB
#undef H
#undef HN
#undef HVM
#undef IND
#undef N
#undef O

View File

@ -88,7 +88,10 @@ enum use_category_t {
USE_VMPre = 23, /* VOWEL_MOD_PRE */
USE_SMAbv = 41, /* SYM_MOD_ABOVE */
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

View File

@ -237,13 +237,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
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 */
case HB_SCRIPT_BENGALI:
case HB_SCRIPT_DEVANAGARI:
@ -350,9 +343,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-8.0 additions */
case HB_SCRIPT_AHOM:
//case HB_SCRIPT_MULTANI:
/* Unicode-9.0 additions */
//case HB_SCRIPT_ADLAM:
case HB_SCRIPT_BHAIKSUKI:
case HB_SCRIPT_MARCHEN:
case HB_SCRIPT_NEWA:
@ -365,7 +358,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-11.0 additions */
case HB_SCRIPT_DOGRA:
case HB_SCRIPT_GUNJALA_GONDI:
//case HB_SCRIPT_HANIFI_ROHINGYA:
case HB_SCRIPT_MAKASAR:
//case HB_SCRIPT_SOGDIAN:
/* If the designer designed the font for the 'DFLT' script,
* (or we ended up arbitrarily pick 'latn'), use the default shaper.

View File

@ -275,10 +275,39 @@ struct hb_ot_shape_context_t
static void
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;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
{
_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
@ -286,8 +315,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
{
if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
buffer->context_len[0] ||
_hb_glyph_info_get_general_category (&buffer->info[0]) !=
HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
!_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
return;
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))
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);
foreach_grapheme (buffer, start, end)
buffer->merge_clusters (start, end);
else
buffer->unsafe_to_break (base, i);
base = i;
}
}
if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
buffer->merge_clusters (base, count);
else
buffer->unsafe_to_break (base, count);
foreach_grapheme (buffer, start, end)
buffer->unsafe_to_break (start, end);
}
static void
@ -353,25 +367,17 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
(HB_DIRECTION_IS_VERTICAL (direction) &&
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)
buffer->merge_clusters (base, count);
buffer->reverse_range (base, count);
foreach_grapheme (buffer, start, end)
{
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 ();

View File

@ -177,7 +177,7 @@ struct fvar
v = (v - axis.default_value) / (axis.default_value - axis.min_value);
else
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:

View File

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

View File

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

View File

@ -101,26 +101,6 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
return ret;
}
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
modified_combining_class (hb_codepoint_t u)
{
@ -286,7 +266,9 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
/* Modified combining marks */
/*
* Modified combining marks
*/
/* Hebrew
*
@ -379,9 +361,37 @@ DECLARE_NULL_INSTANCE (hb_unicode_funcs_t);
FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_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) | \
FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
/*
* Ranges, used for bsearch tables.
*/
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 */

View File

@ -31,10 +31,10 @@
static void
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.",
OT::hb_get_unicode_range_bit (cp),
OT::_hb_ot_os2_get_unicode_range_bit (cp),
cp,
bit);
abort();

View File

@ -51,13 +51,18 @@ static inline hb_face_t *
hb_subset_test_open_font (const char *font_path)
{
#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
char* path = g_strdup (font_path);
char *path = g_strdup (font_path);
#endif
hb_blob_t* blob = hb_blob_create_from_file (path);
hb_face_t* face = hb_face_create (blob, 0);
hb_blob_t *blob = hb_blob_create_from_file (path);
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);
g_free (path);

View File

@ -32,16 +32,10 @@
#include <hb.h>
#include <hb-ft.h>
#include <hb-ot.h>
#include <glib.h>
static const char *text = "طرح‌نَما";
static const char *path =
#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 char *font_path = "fonts/Inconsolata-Regular.abc.ttf";
static char *text = "abc";
static int num_threads = 30;
static int num_iters = 200;
@ -54,7 +48,7 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static void
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_shape (font, buffer, NULL, 0);
}
@ -133,16 +127,33 @@ test_body (void)
int
main (int argc, char **argv)
{
if (argc > 1)
num_threads = atoi (argv[1]);
g_test_init (&argc, &argv, NULL);
#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)
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
// https://github.com/harfbuzz/harfbuzz/issues/1191
hb_language_get_default ();
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);
font = hb_font_create (face);
@ -165,5 +176,7 @@ main (int argc, char **argv)
hb_face_destroy (face);
hb_blob_destroy (blob);
g_free (default_path);
return 0;
}

View File

@ -1,12 +1,18 @@
#include "hb-fuzzer.hh"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char **argv) {
hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
unsigned int 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++) {
printf ("%s\n", argv[i]);

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=1+0|uni17ca=1+0|uni17b8=1@0,300+0|space=7+600]
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
../fonts/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+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]

View File

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

View File

@ -1,4 +1,19 @@
../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
../fonts/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/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+182D,U+180B:[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C:[uni182D.EA1B_g.isol2=0+1000]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+200D,U+182D,U+180B,U+200D:[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C,U+200D:[uni182D.EA1D_g.init2=0+950|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180D,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+182D,U+180B:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C:[space=0+0|uni182D.E8E9_g.fina2=1+1050]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1820,U+200C,U+182D,U+1820,U+1837:[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D:[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+1824,U+182F,U+1822:[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600]
../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|space=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850]

View File

@ -6,3 +6,6 @@
../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210]
../fonts/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/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]