Merge branch 'master' into iter

This commit is contained in:
Behdad Esfahbod 2019-03-28 21:26:50 -07:00
commit a030ce4ff8
70 changed files with 2833 additions and 2488 deletions

17
.ci/build-freetype.sh Normal file
View File

@ -0,0 +1,17 @@
#!/bin/bash
set -x
set -o errexit -o nounset
# 22.0.16 is the libtool version of 2.9.0
if pkg-config --atleast-version 22.0.16 freetype2; then exit; fi
pushd $HOME
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2
tar xf freetype-2.9.tar.bz2
pushd freetype-2.9
./autogen.sh
./configure --prefix=$HOME/.local
make -j4 install
popd
popd

View File

@ -22,6 +22,16 @@ jobs:
- run: make -j4 - run: make -j4
- run: make check || .ci/fail.sh - run: make check || .ci/fail.sh
macos-10.14.3-aat-fonts:
macos:
xcode: "10.2.0"
steps:
- checkout
- run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget autoconf automake libtool pkg-config ragel freetype glib cairo icu4c graphite2
- run: export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" && ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-coretext --with-graphite2
- run: make -j4
- run: make check || .ci/fail.sh
distcheck: distcheck:
docker: docker:
- image: ubuntu:17.10 - image: ubuntu:17.10
@ -239,8 +249,8 @@ jobs:
- image: dockcross/base - image: dockcross/base
steps: steps:
- checkout - checkout
- run: apt update && apt install ragel
- run: git clone https://github.com/vitasdk/vdpm && cd vdpm && ./bootstrap-vitasdk.sh - run: git clone https://github.com/vitasdk/vdpm && cd vdpm && ./bootstrap-vitasdk.sh
- run: echo "#""!""/bin/true" > /usr/bin/ragel && chmod +x /usr/bin/ragel
- run: ./autogen.sh --prefix=/usr/local/vitasdk/arm-vita-eabi --host=arm-vita-eabi - run: ./autogen.sh --prefix=/usr/local/vitasdk/arm-vita-eabi --host=arm-vita-eabi
- run: make -j32 - run: make -j32
@ -249,7 +259,6 @@ jobs:
- image: dockcross/android-arm - image: dockcross/android-arm
steps: steps:
- checkout - checkout
- run: apt update && apt install ragel
- run: cmake -Bbuild -H. -GNinja - run: cmake -Bbuild -H. -GNinja
- run: ninja -Cbuild - run: ninja -Cbuild
@ -258,7 +267,6 @@ jobs:
- image: dockcross/browser-asmjs - image: dockcross/browser-asmjs
steps: steps:
- checkout - checkout
- run: apt update && apt install ragel
- run: cmake -Bbuild -H. -GNinja - run: cmake -Bbuild -H. -GNinja
- run: ninja -Cbuild - run: ninja -Cbuild
@ -267,7 +275,6 @@ jobs:
- image: dockcross/linux-arm64 - image: dockcross/linux-arm64
steps: steps:
- checkout - checkout
- run: apt update && apt install ragel
- run: cmake -Bbuild -H. -GNinja - run: cmake -Bbuild -H. -GNinja
- run: ninja -Cbuild - run: ninja -Cbuild
@ -276,7 +283,6 @@ jobs:
- image: dockcross/linux-mips - image: dockcross/linux-mips
steps: steps:
- checkout - checkout
- run: apt update && apt install ragel
- run: cmake -Bbuild -H. -GNinja - run: cmake -Bbuild -H. -GNinja
- run: ninja -Cbuild - run: ninja -Cbuild
@ -285,7 +291,6 @@ jobs:
# - image: dockcross/windows-x64 # - image: dockcross/windows-x64
# steps: # steps:
# - checkout # - checkout
# - run: apt update && apt install ragel
# - run: cmake -Bbuild -H. -GNinja # - run: cmake -Bbuild -H. -GNinja
# - run: ninja -Cbuild # - run: ninja -Cbuild
@ -296,6 +301,7 @@ workflows:
# macOS # macOS
- macos-10.12.6-aat-fonts - macos-10.12.6-aat-fonts
- macos-10.13.6-aat-fonts - macos-10.13.6-aat-fonts
- macos-10.14.3-aat-fonts
# both autotools and cmake # both autotools and cmake
- distcheck - distcheck

View File

@ -8,11 +8,8 @@ insert_final_newline = true
[*.{c,cc,h,hh}] [*.{c,cc,h,hh}]
tab_width = 8 tab_width = 8
indent_style = tab indent_size = 2
# This should be the following but as VSCode and Atom don't support it, disabled for now indent_style = space
# https://github.com/Microsoft/vscode/issues/44438
# indent_size = 2
# indent_style = space
[*.{py,sh}] [*.{py,sh}]
indent_style = tab indent_style = tab

View File

@ -16,9 +16,10 @@ matrix:
- os: linux - os: linux
compiler: gcc compiler: gcc
script: script:
# Remove these two lines when Travis updated its distro # Remove the following three lines when Travis updates its distro
- wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2 && tar xf freetype-2.9.tar.bz2 && cd freetype-2.9 && ./autogen.sh && ./configure && make -j4 && cd .. - export PKG_CONFIG_PATH="$HOME/.local/lib/pkgconfig"
- export LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" - export LD_LIBRARY_PATH="$HOME/.local/lib"
- bash .ci/build-freetype.sh
- ./autogen.sh - ./autogen.sh
- ./configure $CONFIGURE_OPTS --enable-gtk-doc --enable-code-coverage - ./configure $CONFIGURE_OPTS --enable-gtk-doc --enable-code-coverage
@ -34,35 +35,24 @@ matrix:
- os: linux - os: linux
compiler: clang compiler: clang
script: script:
# Remove these two lines when Travis updated its distro # Remove the following three lines when Travis updates its distro
- wget http://download.savannah.gnu.org/releases/freetype/freetype-2.9.tar.bz2 && tar xf freetype-2.9.tar.bz2 && cd freetype-2.9 && ./autogen.sh && ./configure && make -j4 && cd .. - export PKG_CONFIG_PATH="$HOME/.local/lib/pkgconfig"
- export LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs" - export LD_LIBRARY_PATH="$HOME/.local/lib"
- bash .ci/build-freetype.sh
- ./autogen.sh - ./autogen.sh
- ./configure $CONFIGURE_OPTS - ./configure $CONFIGURE_OPTS
- make - make
- make check || .ci/fail.sh - make check || .ci/fail.sh
- os: osx
compiler: clang
install:
- brew update;
# Workaround Travis/brew bug
- brew uninstall libtool && brew install libtool
- brew install ragel freetype glib gobject-introspection cairo graphite2 || true
- brew upgrade icu4c || true
- export PATH="/usr/local/opt/icu4c/sbin:/usr/local/opt/icu4c/bin:$PATH"
- export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
script:
- ./autogen.sh
- ./configure $CONFIGURE_OPTS --with-coretext
- make
- make check || .ci/fail.sh
notifications: notifications:
irc: "irc.freenode.org#harfbuzz" irc: "irc.freenode.org#harfbuzz"
email: harfbuzz-bots-chatter@googlegroups.com email: harfbuzz-bots-chatter@googlegroups.com
cache:
directories:
- /home/travis/.local
addons: addons:
apt: apt:
packages: packages:

View File

@ -842,18 +842,6 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
endif () endif ()
endif () endif ()
if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja")
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics")
endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color")
endif ()
endif ()
if (HB_BUILD_TESTS) if (HB_BUILD_TESTS)
## src/ executables ## src/ executables
foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)

View File

@ -36,7 +36,7 @@ ChangeLog: $(srcdir)/ChangeLog
$(srcdir)/ChangeLog: $(srcdir)/ChangeLog:
$(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \ $(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
(GIT_DIR=$(top_srcdir)/.git \ (GIT_DIR=$(top_srcdir)/.git \
$(GIT) log $(CHANGELOG_RANGE) --stat) | fmt --split-only > $@.tmp \ $(GIT) log $(CHANGELOG_RANGE) --stat) > $@.tmp \
&& mv -f $@.tmp "$(srcdir)/ChangeLog" \ && mv -f $@.tmp "$(srcdir)/ChangeLog" \
|| ($(RM) $@.tmp; \ || ($(RM) $@.tmp; \
echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \

11
NEWS
View File

@ -1,3 +1,14 @@
Overview of changes leading to 2.4.0
Monday, March 25, 2019
====================================
- Unicode 12.
- Misc fixes.
- Subsetter improvements.
- New API:
HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE
hb_directwrite_face_create()
Overview of changes leading to 2.3.1 Overview of changes leading to 2.3.1
Wednesday, January 30, 2019 Wednesday, January 30, 2019
==================================== ====================================

View File

@ -1,6 +1,6 @@
AC_PREREQ([2.64]) AC_PREREQ([2.64])
AC_INIT([HarfBuzz], AC_INIT([HarfBuzz],
[2.3.1], [2.4.0],
[https://github.com/harfbuzz/harfbuzz/issues/new], [https://github.com/harfbuzz/harfbuzz/issues/new],
[harfbuzz], [harfbuzz],
[http://harfbuzz.org/]) [http://harfbuzz.org/])

View File

@ -136,6 +136,7 @@
<index id="api-index-full"><title>API Index</title><xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include></index> <index id="api-index-full"><title>API Index</title><xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include></index>
<index id="deprecated-api-index" role="deprecated"><title>Index of deprecated API</title><xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include></index> <index id="deprecated-api-index" role="deprecated"><title>Index of deprecated API</title><xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include></index>
<index id="api-index-2-2-0" role="2.2.0"><title>Index of new symbols in 2.2.0</title><xi:include href="xml/api-index-2.2.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-2-1-0" role="2.1.0"><title>Index of new symbols in 2.1.0</title><xi:include href="xml/api-index-2.1.0.xml"><xi:fallback /></xi:include></index> <index id="api-index-2-1-0" role="2.1.0"><title>Index of new symbols in 2.1.0</title><xi:include href="xml/api-index-2.1.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-2-0-0" role="2.0.0"><title>Index of new symbols in 2.0.0</title><xi:include href="xml/api-index-2.0.0.xml"><xi:fallback /></xi:include></index> <index id="api-index-2-0-0" role="2.0.0"><title>Index of new symbols in 2.0.0</title><xi:include href="xml/api-index-2.0.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-1-9-0" role="1.9.0"><title>Index of new symbols in 1.9.0</title><xi:include href="xml/api-index-1.9.0.xml"><xi:fallback /></xi:include></index> <index id="api-index-1-9-0" role="1.9.0"><title>Index of new symbols in 1.9.0</title><xi:include href="xml/api-index-1.9.0.xml"><xi:fallback /></xi:include></index>

View File

@ -124,11 +124,17 @@ hb_script_get_horizontal_direction
hb_language_from_string hb_language_from_string
hb_language_to_string hb_language_to_string
hb_language_get_default hb_language_get_default
hb_feature_from_string
hb_feature_to_string
hb_variation_from_string
hb_variation_to_string
hb_bool_t hb_bool_t
hb_codepoint_t hb_codepoint_t
hb_destroy_func_t hb_destroy_func_t
hb_direction_t hb_direction_t
hb_language_t hb_language_t
hb_feature_t
hb_variation_t
hb_mask_t hb_mask_t
hb_position_t hb_position_t
hb_tag_t hb_tag_t
@ -147,6 +153,8 @@ HB_DIRECTION_IS_HORIZONTAL
HB_DIRECTION_IS_VALID HB_DIRECTION_IS_VALID
HB_DIRECTION_IS_VERTICAL HB_DIRECTION_IS_VERTICAL
HB_LANGUAGE_INVALID HB_LANGUAGE_INVALID
HB_FEATURE_GLOBAL_END
HB_FEATURE_GLOBAL_START
<SUBSECTION Private> <SUBSECTION Private>
HB_BEGIN_DECLS HB_BEGIN_DECLS
HB_END_DECLS HB_END_DECLS
@ -321,9 +329,6 @@ hb_font_set_ppem
hb_font_set_ptem hb_font_set_ptem
hb_font_set_scale hb_font_set_scale
hb_font_set_user_data hb_font_set_user_data
hb_variation_t
hb_variation_from_string
hb_variation_to_string
hb_font_set_variations hb_font_set_variations
hb_font_set_var_coords_design hb_font_set_var_coords_design
hb_font_set_var_coords_normalized hb_font_set_var_coords_normalized
@ -649,11 +654,6 @@ hb_set_union
<SECTION> <SECTION>
<FILE>hb-shape</FILE> <FILE>hb-shape</FILE>
HB_FEATURE_GLOBAL_END
HB_FEATURE_GLOBAL_START
hb_feature_t
hb_feature_from_string
hb_feature_to_string
hb_shape hb_shape
hb_shape_full hb_shape_full
hb_shape_list_shapers hb_shape_list_shapers

View File

@ -26,7 +26,7 @@ for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do
symprefix= symprefix=
if test $suffix = dylib; then symprefix=_; fi if test $suffix = dylib; then symprefix=_; fi
EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`" EXPORTED_SYMBOLS=`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`
prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`

View File

@ -79,10 +79,6 @@ data = combined
del combined del combined
num = len (data) num = len (data)
for u in [0x17CD, 0x17CE, 0x17CF, 0x17D0, 0x17D3]:
if data[u][0] == 'Other':
data[u][0] = "Vowel_Dependent"
# Move the outliers NO-BREAK SPACE and DOTTED CIRCLE out # Move the outliers NO-BREAK SPACE and DOTTED CIRCLE out
singles = {} singles = {}
for u in ALLOWED_SINGLES: for u in ALLOWED_SINGLES:

View File

@ -48,7 +48,6 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block')
# TODO Characters that are not in Unicode Indic files, but used in USE # TODO Characters that are not in Unicode Indic files, but used in USE
data[0][0x034F] = defaults[0] data[0][0x034F] = defaults[0]
data[0][0x2060] = defaults[0] data[0][0x2060] = defaults[0]
data[0][0x20F0] = defaults[0]
# TODO https://github.com/roozbehp/unicode-data/issues/9 # TODO https://github.com/roozbehp/unicode-data/issues/9
data[0][0x11C44] = 'Consonant_Placeholder' data[0][0x11C44] = 'Consonant_Placeholder'
data[0][0x11C45] = 'Consonant_Placeholder' data[0][0x11C45] = 'Consonant_Placeholder'
@ -317,12 +316,11 @@ def map_to_use(data):
# Resolve Indic_Syllabic_Category # Resolve Indic_Syllabic_Category
# TODO: These don't have UISC assigned in Unicode 8.0, but have UIPC # TODO: These don't have UISC assigned in Unicode 12.0, but have UIPC
if U == 0x17DD: UISC = Vowel_Dependent
if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
# Tibetan: # Tibetan:
# TODO: These don't have UISC assigned in Unicode 11.0, but have UIPC # TODO: These don't have UISC assigned in Unicode 12.0, but have UIPC
if 0x0F18 <= U <= 0x0F19 or 0x0F3E <= U <= 0x0F3F: UISC = Vowel_Dependent if 0x0F18 <= U <= 0x0F19 or 0x0F3E <= U <= 0x0F3F: UISC = Vowel_Dependent
if 0x0F86 <= U <= 0x0F87: UISC = Tone_Mark if 0x0F86 <= U <= 0x0F87: UISC = Tone_Mark
# Overrides to allow NFC order matching syllable # Overrides to allow NFC order matching syllable
@ -347,13 +345,7 @@ def map_to_use(data):
if U == 0x1CED: UISC = Tone_Mark if U == 0x1CED: UISC = Tone_Mark
# TODO: https://github.com/harfbuzz/harfbuzz/issues/525 # TODO: https://github.com/harfbuzz/harfbuzz/issues/525
if U == 0x1A7F: UISC = Consonant_Final; UIPC = Bottom if U == 0x1A7F: UISC = Consonant_Final
# TODO: https://github.com/harfbuzz/harfbuzz/pull/609
if U == 0x20F0: UISC = Cantillation_Mark; UIPC = Top
# TODO: https://github.com/harfbuzz/harfbuzz/pull/626
if U == 0xA8B4: UISC = Consonant_Medial
# TODO: https://github.com/harfbuzz/harfbuzz/issues/1105 # TODO: https://github.com/harfbuzz/harfbuzz/issues/1105
if U == 0x11134: UISC = Gemination_Mark if U == 0x11134: UISC = Gemination_Mark
@ -367,27 +359,19 @@ def map_to_use(data):
# Resolve Indic_Positional_Category # Resolve Indic_Positional_Category
# TODO: Not in Unicode 8.0 yet, but in spec. # TODO: These should die, but have UIPC in Unicode 12.0
if U == 0x1B6C: UIPC = Bottom
# TODO: These should die, but have UIPC in Unicode 8.0
if U in [0x953, 0x954]: UIPC = Not_Applicable if U in [0x953, 0x954]: UIPC = Not_Applicable
# TODO: In USE's override list but not in Unicode 11.0 # TODO: In USE's override list but not in Unicode 12.0
if U == 0x103C: UIPC = Left if U == 0x103C: UIPC = Left
# TODO: These are not in USE's override list that we have, nor are they in Unicode 11.0 # TODO: These are not in USE's override list that we have, nor are they in Unicode 12.0
if 0xA926 <= U <= 0xA92A: UIPC = Top if 0xA926 <= U <= 0xA92A: UIPC = Top
if U == 0x111CA: UIPC = Bottom
if U == 0x11300: UIPC = Top
# TODO: https://github.com/harfbuzz/harfbuzz/pull/1037 # TODO: https://github.com/harfbuzz/harfbuzz/pull/1037
if U == 0x11302: UIPC = Top # and https://github.com/harfbuzz/harfbuzz/issues/1631
if U == 0x1133C: UIPC = Bottom if U in [0x11302, 0x11303, 0x114C1]: UIPC = Top
if U == 0x1171E: UIPC = Left # Correct?! if U == 0x1171E: UIPC = Left
if 0x1CF2 <= U <= 0x1CF3: UIPC = Right
if 0x1CF8 <= U <= 0x1CF9: UIPC = Top if 0x1CF8 <= U <= 0x1CF9: UIPC = Top
# https://github.com/roozbehp/unicode-data/issues/8
if U == 0x0A51: UIPC = Bottom
assert (UIPC in [Not_Applicable, Visual_Order_Left] or assert (UIPC in [Not_Applicable, Visual_Order_Left] or
USE in use_positions), "%s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC) USE in use_positions), "%s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC)

View File

@ -180,6 +180,9 @@ print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB
print ('\t\t\t\t hb_buffer_t *buffer,') print ('\t\t\t\t hb_buffer_t *buffer,')
print ('\t\t\t\t hb_font_t *font HB_UNUSED)') print ('\t\t\t\t hb_font_t *font HB_UNUSED)')
print ('{') print ('{')
print (' if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)')
print (' return;')
print ()
print (' /* UGLY UGLY UGLY business of adding dotted-circle in the middle of') print (' /* UGLY UGLY UGLY business of adding dotted-circle in the middle of')
print (' * vowel-sequences that look like another vowel. Data for each script') print (' * vowel-sequences that look like another vowel. Data for each script')
print (' * collected from the USE script development spec.') print (' * collected from the USE script development spec.')
@ -212,6 +215,7 @@ print (' if (processed)')
print (' {') print (' {')
print (' if (buffer->idx < count)') print (' if (buffer->idx < count)')
print (' buffer->next_glyph ();') print (' buffer->next_glyph ();')
print (' buffer->swap_buffers ();')
print (' }') print (' }')
print ('}') print ('}')

View File

@ -76,6 +76,7 @@ struct ankr
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
return_trace (likely (c->check_struct (this) && return_trace (likely (c->check_struct (this) &&
version == 0 && version == 0 &&
c->check_range (this, anchorData) &&
lookupTable.sanitize (c, this, &(this+anchorData)))); lookupTable.sanitize (c, this, &(this+anchorData))));
} }

View File

@ -418,15 +418,11 @@ struct Lookup
} /* Close namespace. */ } /* Close namespace. */
/* Ugly hand-coded null objects for template Lookup<> :(. */ /* Ugly hand-coded null objects for template Lookup<> :(. */
extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2];
template <> template <typename T>
/*static*/ inline const AAT::Lookup<OT::HBUINT16>& Null<AAT::Lookup<OT::HBUINT16> > () struct Null<AAT::Lookup<T> > {
{ return *reinterpret_cast<const AAT::Lookup<OT::HBUINT16> *> (_hb_Null_AAT_Lookup); } static AAT::Lookup<T> const & get_null ()
template <> { return *reinterpret_cast<const AAT::Lookup<T> *> (_hb_Null_AAT_Lookup); }
/*static*/ inline const AAT::Lookup<OT::HBUINT32>& Null<AAT::Lookup<OT::HBUINT32> > () };
{ return *reinterpret_cast<const AAT::Lookup<OT::HBUINT32> *> (_hb_Null_AAT_Lookup); }
template <>
/*static*/ inline const AAT::Lookup<OT::Offset<OT::HBUINT16, false> >& Null<AAT::Lookup<OT::Offset<OT::HBUINT16, false> > > ()
{ return *reinterpret_cast<const AAT::Lookup<OT::Offset<OT::HBUINT16, false> > *> (_hb_Null_AAT_Lookup); }
namespace AAT { namespace AAT {
enum { DELETED_GLYPH = 0xFFFF }; enum { DELETED_GLYPH = 0xFFFF };

View File

@ -86,11 +86,11 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
#define hb_atomic_int_impl_add(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->fetch_add ((V), std::memory_order_acq_rel)) #define hb_atomic_int_impl_add(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->fetch_add ((V), std::memory_order_acq_rel))
#define hb_atomic_int_impl_set_relaxed(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_relaxed)) #define hb_atomic_int_impl_set_relaxed(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_relaxed))
#define hb_atomic_int_impl_set(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_release)) #define hb_atomic_int_impl_set(AI, V) (reinterpret_cast<std::atomic<int> *> (AI)->store ((V), std::memory_order_release))
#define hb_atomic_int_impl_get_relaxed(AI) (reinterpret_cast<std::atomic<int> *> (AI)->load (std::memory_order_relaxed)) #define hb_atomic_int_impl_get_relaxed(AI) (reinterpret_cast<std::atomic<int> const *> (AI)->load (std::memory_order_relaxed))
#define hb_atomic_int_impl_get(AI) (reinterpret_cast<std::atomic<int> *> (AI)->load (std::memory_order_acquire)) #define hb_atomic_int_impl_get(AI) (reinterpret_cast<std::atomic<int> const *> (AI)->load (std::memory_order_acquire))
#define hb_atomic_ptr_impl_set_relaxed(P, V) (reinterpret_cast<std::atomic<void*> *> (P)->store ((V), std::memory_order_relaxed)) #define hb_atomic_ptr_impl_set_relaxed(P, V) (reinterpret_cast<std::atomic<void*> *> (P)->store ((V), std::memory_order_relaxed))
#define hb_atomic_ptr_impl_get_relaxed(P) (reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_relaxed)) #define hb_atomic_ptr_impl_get_relaxed(P) (reinterpret_cast<std::atomic<void*> const *> (P)->load (std::memory_order_relaxed))
#define hb_atomic_ptr_impl_get(P) (reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_acquire)) #define hb_atomic_ptr_impl_get(P) (reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_acquire))
static inline bool static inline bool
_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)

View File

@ -284,6 +284,10 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
* space glyph and zeroing the advance width.) * space glyph and zeroing the advance width.)
* @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
* precedence over this flag. Since: 1.8.0 * precedence over this flag. Since: 1.8.0
* @HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE:
* flag indicating that a dotted circle should
* not be inserted in the rendering of incorrect
* character sequences (such at <0905 093E>). Since: 2.4
* *
* Since: 0.9.20 * Since: 0.9.20
*/ */
@ -292,7 +296,8 @@ typedef enum { /*< flags >*/
HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */ HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */ HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u, HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u,
HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u,
HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE = 0x00000010u
} hb_buffer_flags_t; } hb_buffer_flags_t;
HB_EXTERN void HB_EXTERN void

View File

@ -731,7 +731,7 @@ parse_uint (const char **pp, const char *end, unsigned int *pv)
/* Intentionally use strtol instead of strtoul, such that /* Intentionally use strtol instead of strtoul, such that
* -1 turns into "big number"... */ * -1 turns into "big number"... */
errno = 0; errno = 0;
v = strtol (p, &pend, 0); v = strtol (p, &pend, 10);
if (errno || p == pend) if (errno || p == pend)
return false; return false;
@ -755,7 +755,7 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv)
/* Intentionally use strtol instead of strtoul, such that /* Intentionally use strtol instead of strtoul, such that
* -1 turns into "big number"... */ * -1 turns into "big number"... */
errno = 0; errno = 0;
v = strtol (p, &pend, 0); v = strtol (p, &pend, 10);
if (errno || p == pend) if (errno || p == pend)
return false; return false;
@ -857,9 +857,14 @@ parse_bool (const char **pp, const char *end, uint32_t *pv)
(*pp)++; (*pp)++;
/* CSS allows on/off as aliases 1/0. */ /* CSS allows on/off as aliases 1/0. */
if (*pp - p == 2 && 0 == strncmp (p, "on", 2)) if (*pp - p == 2
&& TOLOWER (p[0]) == 'o'
&& TOLOWER (p[1]) == 'n')
*pv = 1; *pv = 1;
else if (*pp - p == 3 && 0 == strncmp (p, "off", 3)) else if (*pp - p == 3
&& TOLOWER (p[0]) == 'o'
&& TOLOWER (p[1]) == 'f'
&& TOLOWER (p[2]) == 'f')
*pv = 0; *pv = 0;
else else
return false; return false;
@ -974,7 +979,41 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
* *
* Parses a string into a #hb_feature_t. * Parses a string into a #hb_feature_t.
* *
* TODO: document the syntax here. * The format for specifying feature strings follows. All valid CSS
* font-feature-settings values other than 'normal' and the global values are
* also accepted, though not documented below. CSS string escapes are not
* supported.
*
* The range indices refer to the positions between Unicode characters. The
* position before the first character is always 0.
*
* The format is Python-esque. Here is how it all works:
*
* <informaltable pgwide='1' align='left' frame='none'>
* <tgroup cols='5'>
* <thead>
* <row><entry>Syntax</entry> <entry>Value</entry> <entry>Start</entry> <entry>End</entry></row>
* </thead>
* <tbody>
* <row><entry>Setting value:</entry></row>
* <row><entry>kern</entry> <entry>1</entry> <entry>0</entry> <entry></entry> <entry>Turn feature on</entry></row>
* <row><entry>+kern</entry> <entry>1</entry> <entry>0</entry> <entry></entry> <entry>Turn feature on</entry></row>
* <row><entry>-kern</entry> <entry>0</entry> <entry>0</entry> <entry></entry> <entry>Turn feature off</entry></row>
* <row><entry>kern=0</entry> <entry>0</entry> <entry>0</entry> <entry></entry> <entry>Turn feature off</entry></row>
* <row><entry>kern=1</entry> <entry>1</entry> <entry>0</entry> <entry></entry> <entry>Turn feature on</entry></row>
* <row><entry>aalt=2</entry> <entry>2</entry> <entry>0</entry> <entry></entry> <entry>Choose 2nd alternate</entry></row>
* <row><entry>Setting index:</entry></row>
* <row><entry>kern[]</entry> <entry>1</entry> <entry>0</entry> <entry></entry> <entry>Turn feature on</entry></row>
* <row><entry>kern[:]</entry> <entry>1</entry> <entry>0</entry> <entry></entry> <entry>Turn feature on</entry></row>
* <row><entry>kern[5:]</entry> <entry>1</entry> <entry>5</entry> <entry></entry> <entry>Turn feature on, partial</entry></row>
* <row><entry>kern[:5]</entry> <entry>1</entry> <entry>0</entry> <entry>5</entry> <entry>Turn feature on, partial</entry></row>
* <row><entry>kern[3:5]</entry> <entry>1</entry> <entry>3</entry> <entry>5</entry> <entry>Turn feature on, range</entry></row>
* <row><entry>kern[3]</entry> <entry>1</entry> <entry>3</entry> <entry>3+1</entry> <entry>Turn feature on, single char</entry></row>
* <row><entry>Mixing it all:</entry></row>
* <row><entry>aalt[3:5]=2</entry> <entry>2</entry> <entry>3</entry> <entry>5</entry> <entry>Turn 2nd alternate on for range</entry></row>
* </tbody>
* </tgroup>
* </informaltable>
* *
* Return value: * Return value:
* %true if @str is successfully parsed, %false otherwise. * %true if @str is successfully parsed, %false otherwise.

View File

@ -357,6 +357,14 @@ typedef enum
/*11.0*/HB_SCRIPT_OLD_SOGDIAN = HB_TAG ('S','o','g','o'), /*11.0*/HB_SCRIPT_OLD_SOGDIAN = HB_TAG ('S','o','g','o'),
/*11.0*/HB_SCRIPT_SOGDIAN = HB_TAG ('S','o','g','d'), /*11.0*/HB_SCRIPT_SOGDIAN = HB_TAG ('S','o','g','d'),
/*
* Since REPLACEME
*/
/*12.0*/HB_SCRIPT_ELYMAIC = HB_TAG ('E','l','y','m'),
/*12.0*/HB_SCRIPT_NANDINAGARI = HB_TAG ('N','a','n','d'),
/*12.0*/HB_SCRIPT_NYIAKENG_PUACHUE_HMONG = HB_TAG ('H','m','n','p'),
/*12.0*/HB_SCRIPT_WANCHO = HB_TAG ('W','c','h','o'),
/* No script set. */ /* No script set. */
HB_SCRIPT_INVALID = HB_TAG_NONE, HB_SCRIPT_INVALID = HB_TAG_NONE,

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2015-2018 Ebrahim Byagowi * Copyright © 2015-2019 Ebrahim Byagowi
* *
* This is part of HarfBuzz, a text shaping library. * This is part of HarfBuzz, a text shaping library.
* *
@ -658,10 +658,10 @@ retry_getglyphs:
* alignment needed after the WORD array. sizeof (WORD) == 2. */ * alignment needed after the WORD array. sizeof (WORD) == 2. */
unsigned int glyphs_size = (scratch_size * sizeof (int) - 2) unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
/ (sizeof (WORD) + / (sizeof (WORD) +
sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) + sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) +
sizeof (int) + sizeof (int) +
sizeof (DWRITE_GLYPH_OFFSET) + sizeof (DWRITE_GLYPH_OFFSET) +
sizeof (uint32_t)); sizeof (uint32_t));
ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size); ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
#undef ALLOCATE_ARRAY #undef ALLOCATE_ARRAY
@ -868,3 +868,63 @@ hb_directwrite_shape_experimental_width (hb_font_t *font,
return res; return res;
} }
struct _hb_directwrite_font_table_context {
IDWriteFontFace *face;
void *table_context;
};
static void
_hb_directwrite_table_data_release (void *data)
{
_hb_directwrite_font_table_context *context = (_hb_directwrite_font_table_context *) data;
context->face->ReleaseFontTable (context->table_context);
delete context;
}
static hb_blob_t *
reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
{
IDWriteFontFace *dw_face = ((IDWriteFontFace *) user_data);
const void *data;
uint32_t length;
void *table_context;
BOOL exists;
if (!dw_face || FAILED (dw_face->TryGetFontTable (hb_uint32_swap (tag), &data,
&length, &table_context, &exists)))
return nullptr;
if (!data || !exists || !length)
{
dw_face->ReleaseFontTable (table_context);
return nullptr;
}
_hb_directwrite_font_table_context *context = new _hb_directwrite_font_table_context;
context->face = dw_face;
context->table_context = table_context;
return hb_blob_create ((const char *) data, length, HB_MEMORY_MODE_READONLY,
context, _hb_directwrite_table_data_release);
}
static void
_hb_directwrite_font_release (void *data)
{
if (data)
((IDWriteFontFace *) data)->Release ();
}
/**
* hb_directwrite_face_create:
* @font_face:
* Since: REPLACEME
**/
hb_face_t *
hb_directwrite_face_create (IDWriteFontFace *font_face)
{
if (font_face)
font_face->AddRef ();
return hb_face_create_for_tables (reference_table, font_face,
_hb_directwrite_font_release);
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2015 Ebrahim Byagowi * Copyright © 2015-2019 Ebrahim Byagowi
* *
* This is part of HarfBuzz, a text shaping library. * This is part of HarfBuzz, a text shaping library.
* *
@ -34,6 +34,9 @@ hb_directwrite_shape_experimental_width (hb_font_t *font, hb_buffer_t *buffer,
const hb_feature_t *features, const hb_feature_t *features,
unsigned int num_features, float width); unsigned int num_features, float width);
HB_EXTERN hb_face_t *
hb_directwrite_face_create (IDWriteFontFace *font_face);
HB_END_DECLS HB_END_DECLS
#endif /* HB_DIRECTWRITE_H */ #endif /* HB_DIRECTWRITE_H */

View File

@ -225,7 +225,7 @@ struct hb_graphite2_cluster_t {
unsigned int base_glyph; unsigned int base_glyph;
unsigned int num_glyphs; unsigned int num_glyphs;
unsigned int cluster; unsigned int cluster;
float advance; unsigned int advance;
}; };
hb_bool_t hb_bool_t
@ -253,7 +253,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
gr_segment *seg = nullptr; gr_segment *seg = nullptr;
const gr_slot *is; const gr_slot *is;
unsigned int ci = 0, ic = 0; unsigned int ci = 0, ic = 0;
float curradvx = 0., curradvy = 0.; unsigned int curradvx = 0, curradvy = 0;
unsigned int scratch_size; unsigned int scratch_size;
hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size); hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size);
@ -324,11 +324,15 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
hb_codepoint_t *pg = gids; hb_codepoint_t *pg = gids;
clusters[0].cluster = buffer->info[0].cluster; clusters[0].cluster = buffer->info[0].cluster;
float curradv = 0.; unsigned int upem = hb_face_get_upem (face);
float xscale = (float) font->x_scale / upem;
float yscale = (float) font->y_scale / upem;
yscale *= yscale / xscale;
unsigned int curradv = 0;
if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
{ {
curradv = gr_slot_origin_X(gr_seg_first_slot(seg)); curradv = gr_slot_origin_X(gr_seg_first_slot(seg)) * xscale;
clusters[0].advance = gr_seg_advance_X(seg) - curradv; clusters[0].advance = gr_seg_advance_X(seg) * xscale - curradv;
} }
else else
clusters[0].advance = 0; clusters[0].advance = 0;
@ -355,14 +359,17 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
c->base_glyph = ic; c->base_glyph = ic;
c->num_glyphs = 0; c->num_glyphs = 0;
if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
c->advance = curradv - gr_slot_origin_X(is); {
c->advance = curradv - gr_slot_origin_X(is) * xscale;
curradv -= c->advance;
}
else else
{ {
c->advance = 0; c->advance = 0;
clusters[ci].advance += gr_slot_origin_X(is) - curradv; clusters[ci].advance += gr_slot_origin_X(is) * xscale - curradv;
curradv += clusters[ci].advance;
} }
ci++; ci++;
curradv = gr_slot_origin_X(is);
} }
clusters[ci].num_glyphs++; clusters[ci].num_glyphs++;
@ -373,7 +380,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction))
clusters[ci].advance += curradv; clusters[ci].advance += curradv;
else else
clusters[ci].advance += gr_seg_advance_X(seg) - curradv; clusters[ci].advance += gr_seg_advance_X(seg) * xscale - curradv;
ci++; ci++;
for (unsigned int i = 0; i < ci; ++i) for (unsigned int i = 0; i < ci; ++i)
@ -388,10 +395,6 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
} }
buffer->len = glyph_count; buffer->len = glyph_count;
unsigned int upem = hb_face_get_upem (face);
float xscale = (float) font->x_scale / upem;
float yscale = (float) font->y_scale / upem;
yscale *= yscale / xscale;
/* Positioning. */ /* Positioning. */
unsigned int currclus = (unsigned int) -1; unsigned int currclus = (unsigned int) -1;
const hb_glyph_info_t *info = buffer->info; const hb_glyph_info_t *info = buffer->info;
@ -404,7 +407,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
pPos->x_offset = gr_slot_origin_X (is) * xscale - curradvx; pPos->x_offset = gr_slot_origin_X (is) * xscale - curradvx;
pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy; pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
if (info->cluster != currclus) { if (info->cluster != currclus) {
pPos->x_advance = info->var1.i32 * xscale; pPos->x_advance = info->var1.i32;
curradvx += pPos->x_advance; curradvx += pPos->x_advance;
currclus = info->cluster; currclus = info->cluster;
} else } else
@ -421,7 +424,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
{ {
if (info->cluster != currclus) if (info->cluster != currclus)
{ {
pPos->x_advance = info->var1.i32 * xscale; pPos->x_advance = info->var1.i32;
curradvx -= pPos->x_advance; curradvx -= pPos->x_advance;
currclus = info->cluster; currclus = info->cluster;
} else } else
@ -429,7 +432,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale; pPos->y_advance = gr_slot_advance_Y (is, grface, nullptr) * yscale;
curradvy -= pPos->y_advance; curradvy -= pPos->y_advance;
pPos->x_offset = (gr_slot_origin_X (is) - info->var1.i32) * xscale - curradvx + pPos->x_advance; pPos->x_offset = gr_slot_origin_X (is) * xscale - info->var1.i32 - curradvx + pPos->x_advance;
pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy; pPos->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
} }
hb_buffer_reverse_clusters (buffer); hb_buffer_reverse_clusters (buffer);

View File

@ -326,27 +326,29 @@ struct hb_sanitize_context_t :
} }
bool check_range (const void *base, bool check_range (const void *base,
unsigned int len) const unsigned int len) const
{ {
const char *p = (const char *) base; const char *p = (const char *) base;
bool ok = this->start <= p && bool ok = !len ||
p <= this->end && (this->start <= p &&
(unsigned int) (this->end - p) >= len && p <= this->end &&
this->max_ops-- > 0; (unsigned int) (this->end - p) >= len &&
this->max_ops-- > 0);
DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
"check_range [%p..%p] (%d bytes) in [%p..%p] -> %s", "check_range [%p..%p]"
p, p + len, len, " (%d bytes) in [%p..%p] -> %s",
this->start, this->end, p, p + len, len,
ok ? "OK" : "OUT-OF-RANGE"); this->start, this->end,
ok ? "OK" : "OUT-OF-RANGE");
return likely (ok); return likely (ok);
} }
template <typename T> template <typename T>
bool check_range (const T *base, bool check_range (const T *base,
unsigned int a, unsigned int a,
unsigned int b) const unsigned int b) const
{ {
return !hb_unsigned_mul_overflows (a, b) && return !hb_unsigned_mul_overflows (a, b) &&
this->check_range (base, a * b); this->check_range (base, a * b);
@ -354,9 +356,9 @@ struct hb_sanitize_context_t :
template <typename T> template <typename T>
bool check_range (const T *base, bool check_range (const T *base,
unsigned int a, unsigned int a,
unsigned int b, unsigned int b,
unsigned int c) const unsigned int c) const
{ {
return !hb_unsigned_mul_overflows (a, b) && return !hb_unsigned_mul_overflows (a, b) &&
this->check_range (base, a * b, c); this->check_range (base, a * b, c);

View File

@ -172,7 +172,7 @@ struct hb_map_t
void clear () void clear ()
{ {
memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t)); if (items) memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t));
population = occupancy = 0; population = occupancy = 0;
} }

View File

@ -104,15 +104,18 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_
/* Generic nul-content Null objects. */ /* Generic nul-content Null objects. */
template <typename Type> template <typename Type>
static inline Type const & Null () { struct Null {
static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); static Type const & get_null ()
return *reinterpret_cast<Type const *> (_hb_NullPool); {
} static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
return *reinterpret_cast<Type const *> (_hb_NullPool);
}
};
template <typename QType> template <typename QType>
struct NullHelper struct NullHelper
{ {
typedef hb_remove_const (hb_remove_reference (QType)) Type; typedef hb_remove_const (hb_remove_reference (QType)) Type;
static const Type & get_null () { return Null<Type> (); } static const Type & get_null () { return Null<Type>::get_null (); }
}; };
#define Null(Type) NullHelper<Type>::get_null () #define Null(Type) NullHelper<Type>::get_null ()
@ -121,9 +124,11 @@ struct NullHelper
} /* Close namespace. */ \ } /* Close namespace. */ \
extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \ extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \
template <> \ template <> \
/*static*/ inline const Namespace::Type& Null<Namespace::Type> () { \ struct Null<Namespace::Type> { \
return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \ static Namespace::Type const & get_null () { \
} \ return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
} \
}; \
namespace Namespace { \ namespace Namespace { \
static_assert (true, "Just so we take semicolon after.") static_assert (true, "Just so we take semicolon after.")
#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \ #define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
@ -133,10 +138,12 @@ struct NullHelper
#define DECLARE_NULL_INSTANCE(Type) \ #define DECLARE_NULL_INSTANCE(Type) \
extern HB_INTERNAL const Type _hb_Null_##Type; \ extern HB_INTERNAL const Type _hb_Null_##Type; \
template <> \ template <> \
/*static*/ inline const Type& Null<Type> () { \ struct Null<Type> { \
return _hb_Null_##Type; \ static Type const & get_null () { \
} \ return _hb_Null_##Type; \
static_assert (true, "Just so we take semicolon after.") } \
}; \
static_assert (true, "Just so we take semicolon after.")
#define DEFINE_NULL_INSTANCE(Type) \ #define DEFINE_NULL_INSTANCE(Type) \
const Type _hb_Null_##Type const Type _hb_Null_##Type

View File

@ -525,6 +525,7 @@ struct FDArray : CFFIndexOf<COUNT, FontDict>
for (unsigned i = 0; i < fontDicts.length; i++) for (unsigned i = 0; i < fontDicts.length; i++)
if (fdmap.includes (i)) if (fdmap.includes (i))
{ {
if (unlikely (fid >= fdCount)) return_trace (false);
CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset); CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset);
offset += FontDict::calculate_serialized_size (fontDicts[i], opszr); offset += FontDict::calculate_serialized_size (fontDicts[i], opszr);
} }

View File

@ -52,7 +52,7 @@
* @short_description: OpenType font implementation * @short_description: OpenType font implementation
* @include: hb-ot.h * @include: hb-ot.h
* *
* Functions for using OpenType fonts with hb_shape(). Not that fonts returned * Functions for using OpenType fonts with hb_shape(). Note that fonts returned
* by hb_font_create() default to using these functions, so most clients would * by hb_font_create() default to using these functions, so most clients would
* never need to call these functions directly. * never need to call these functions directly.
**/ **/

View File

@ -957,19 +957,6 @@ hb_ot_layout_lookup_would_substitute (hb_face_t *face,
const hb_codepoint_t *glyphs, const hb_codepoint_t *glyphs,
unsigned int glyphs_length, unsigned int glyphs_length,
hb_bool_t zero_context) hb_bool_t zero_context)
{
return hb_ot_layout_lookup_would_substitute_fast (face,
lookup_index,
glyphs, glyphs_length,
zero_context);
}
bool
hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
unsigned int lookup_index,
const hb_codepoint_t *glyphs,
unsigned int glyphs_length,
bool zero_context)
{ {
if (unlikely (lookup_index >= face->table.GSUB->lookup_count)) return false; if (unlikely (lookup_index >= face->table.GSUB->lookup_count)) return false;
OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context); OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);

View File

@ -96,13 +96,6 @@ HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
* GSUB/GPOS * GSUB/GPOS
*/ */
HB_INTERNAL bool
hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
unsigned int lookup_index,
const hb_codepoint_t *glyphs,
unsigned int glyphs_length,
bool zero_context);
/* Should be called before all the substitute_lookup's are done. */ /* Should be called before all the substitute_lookup's are done. */
HB_INTERNAL void HB_INTERNAL void

View File

@ -6,10 +6,10 @@
* *
* on files with these headers: * on files with these headers:
* *
* # ArabicShaping-11.0.0.txt * # ArabicShaping-12.0.0.txt
* # Date: 2018-02-21, 14:50:00 GMT [KW, RP] * # Date: 2018-09-22, 23:54:00 GMT [KW, RP]
* # Blocks-11.0.0.txt * # Blocks-12.0.0.txt
* # Date: 2017-10-16, 24:39:00 GMT [KW] * # Date: 2018-07-30, 19:40:00 GMT [KW]
* UnicodeData.txt does not have a header. * UnicodeData.txt does not have a header.
*/ */
@ -152,9 +152,9 @@ static const uint8_t joining_table[] =
/* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1E940 */ D,D,D,D, /* 1E940 */ D,D,D,D,X,X,X,X,X,X,X,T,
}; /* Table items: 1304; occupancy: 56% */ }; /* Table items: 1312; occupancy: 56% */
static unsigned int static unsigned int
@ -190,7 +190,7 @@ joining_type (hb_codepoint_t u)
break; break;
case 0x1Eu: case 0x1Eu:
if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u]; if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E94Bu)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
break; break;
default: default:

View File

@ -214,7 +214,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
else else
{ {
/* No valid syllable as base for tone mark; try to insert dotted circle. */ /* No valid syllable as base for tone mark; try to insert dotted circle. */
if (font->has_glyph (0x25CCu)) if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
font->has_glyph (0x25CCu))
{ {
hb_codepoint_t chars[2]; hb_codepoint_t chars[2];
if (!is_zero_width_char (font, u)) { if (!is_zero_width_char (font, u)) {

File diff suppressed because it is too large Load Diff

View File

@ -52,6 +52,7 @@ DOTTEDCIRCLE = 12;
RS = 13; RS = 13;
Repha = 15; Repha = 15;
Ra = 16; Ra = 16;
CM = 17;
Symbol= 18; Symbol= 18;
CS = 19; CS = 19;
@ -67,10 +68,10 @@ matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?; syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?;
halant_group = (z?.H.(ZWJ.N?)?); halant_group = (z?.H.(ZWJ.N?)?);
final_halant_group = halant_group | H.ZWNJ; final_halant_group = halant_group | H.ZWNJ;
medial_group = CM?;
halant_or_matra_group = (final_halant_group | matra_group{0,4}); halant_or_matra_group = (final_halant_group | matra_group{0,4});
complex_syllable_tail = (halant_group.cn){0,4} halant_or_matra_group syllable_tail; complex_syllable_tail = (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail;
consonant_syllable = (Repha|CS)? cn complex_syllable_tail; consonant_syllable = (Repha|CS)? cn complex_syllable_tail;
vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail); vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail);

View File

@ -6,12 +6,12 @@
* *
* on files with these headers: * on files with these headers:
* *
* # IndicSyllabicCategory-11.0.0.txt * # IndicSyllabicCategory-12.0.0.txt
* # Date: 2018-05-21, 18:33:00 GMT [KW, RP] * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
* # IndicPositionalCategory-11.0.0.txt * # IndicPositionalCategory-12.0.0.txt
* # Date: 2018-02-05, 16:21:00 GMT [KW, RP] * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
* # Blocks-11.0.0.txt * # Blocks-12.0.0.txt
* # Date: 2017-10-16, 24:39:00 GMT [KW] * # Date: 2018-07-30, 19:40:00 GMT [KW]
*/ */
#include "hb-ot-shape-complex-indic.hh" #include "hb-ot-shape-complex-indic.hh"
@ -19,21 +19,21 @@
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-macros" #pragma GCC diagnostic ignored "-Wunused-macros"
#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 16 chars; Avagraha */ #define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 17 chars; Avagraha */
#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 83 chars; Bindu */ #define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 86 chars; Bindu */
#define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */ #define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */
#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 58 chars; Cantillation_Mark */ #define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 59 chars; Cantillation_Mark */
#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2110 chars; Consonant */ #define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2160 chars; Consonant */
#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */ #define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 12 chars; Consonant_Dead */
#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 67 chars; Consonant_Final */ #define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 67 chars; Consonant_Final */
#define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */ #define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */
#define ISC_CIP INDIC_SYLLABIC_CATEGORY_CONSONANT_INITIAL_POSTFIXED /* 1 chars; Consonant_Initial_Postfixed */ #define ISC_CIP INDIC_SYLLABIC_CATEGORY_CONSONANT_INITIAL_POSTFIXED /* 1 chars; Consonant_Initial_Postfixed */
#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */ #define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 28 chars; Consonant_Medial */ #define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 29 chars; Consonant_Medial */
#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 21 chars; Consonant_Placeholder */ #define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 22 chars; Consonant_Placeholder */
#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 2 chars; Consonant_Preceding_Repha */ #define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 2 chars; Consonant_Preceding_Repha */
#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 7 chars; Consonant_Prefixed */ #define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 9 chars; Consonant_Prefixed */
#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 95 chars; Consonant_Subjoined */ #define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 94 chars; Consonant_Subjoined */
#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */ #define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */
#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 6 chars; Consonant_With_Stacker */ #define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 6 chars; Consonant_With_Stacker */
#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 3 chars; Gemination_Mark */ #define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 3 chars; Gemination_Mark */
@ -42,7 +42,7 @@
#define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */ #define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */
#define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */ #define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 30 chars; Nukta */ #define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 30 chars; Nukta */
#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 480 chars; Number */ #define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 481 chars; Number */
#define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */ #define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */
#define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */ #define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 21 chars; Pure_Killer */ #define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 21 chars; Pure_Killer */
@ -50,21 +50,21 @@
#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 25 chars; Syllable_Modifier */ #define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 25 chars; Syllable_Modifier */
#define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */ #define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */ #define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 25 chars; Virama */ #define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 27 chars; Virama */
#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 36 chars; Visarga */ #define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 35 chars; Visarga */
#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */ #define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 660 chars; Vowel_Dependent */ #define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 673 chars; Vowel_Dependent */
#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 464 chars; Vowel_Independent */ #define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 476 chars; Vowel_Independent */
#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 340 chars; Bottom */ #define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 349 chars; Bottom */
#define IMC_BL INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT /* 1 chars; Bottom_And_Left */ #define IMC_BL INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT /* 1 chars; Bottom_And_Left */
#define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */ #define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */
#define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 59 chars; Left */ #define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 61 chars; Left */
#define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */ #define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */
#define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */ #define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */ #define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 276 chars; Right */ #define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 281 chars; Right */
#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 393 chars; Top */ #define IMC_T INDIC_MATRA_CATEGORY_TOP /* 398 chars; Top */
#define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */ #define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */
#define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */ #define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */
#define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */ #define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */
@ -152,7 +152,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L), /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L),
/* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), /* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T),
/* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x), /* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x),
/* 0A50 */ _(x,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 0A50 */ _(x,x), _(Ca,B), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x), /* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x),
/* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@ -237,7 +237,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Kannada */ /* Kannada */
/* 0C80 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0C80 */ _(Bi,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), /* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@ -346,8 +346,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B), /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
/* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), /* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O),
/* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x), /* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x),
/* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T),_(CWS,x),_(CWS,x), _(Ca,R), /* 1CF0 */ _(x,x), _(x,x), _(CD,x), _(CD,x), _(Ca,T),_(CWS,x),_(CWS,x), _(Ca,R),
/* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 1CF8 */ _(Ca,x), _(Ca,x), _(CP,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
#define indic_offset_0x2008u 1656 #define indic_offset_0x2008u 1656

View File

@ -239,7 +239,7 @@ struct would_substitute_feature_t
hb_face_t *face) const hb_face_t *face) const
{ {
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context)) if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context))
return true; return true;
return false; return false;
} }
@ -720,7 +720,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
indic_position_t last_pos = POS_START; indic_position_t last_pos = POS_START;
for (unsigned int i = start; i < end; i++) for (unsigned int i = start; i < end; i++)
{ {
if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | FLAG (OT_H)))) if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_H))))
{ {
info[i].indic_position() = last_pos; info[i].indic_position() = last_pos;
if (unlikely (info[i].indic_category() == OT_H && if (unlikely (info[i].indic_category() == OT_H &&
@ -965,6 +965,9 @@ 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)
{ {
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
return;
/* 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. */ * TODO Use a buffer scratch flag to remove the loop. */
bool has_broken_syllables = false; bool has_broken_syllables = false;
@ -1199,9 +1202,14 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
goto search; goto search;
} }
} }
/* -> If ZWNJ follows this halant, position is moved after it. */ /* -> If ZWNJ follows this halant, position is moved after it.
if (info[new_pos + 1].indic_category() == OT_ZWNJ) *
new_pos++; * IMPLEMENTATION NOTES:
*
* This is taken care of by the state-machine. A Halant,ZWNJ is a terminating
* sequence for a consonant syllable; any pre-base matras occurring after it
* will belong to the subsequent syllable.
*/
} }
} }
else else

View File

@ -62,17 +62,19 @@ enum indic_category_t {
OT_Coeng = 14, /* Khmer-style Virama. */ OT_Coeng = 14, /* Khmer-style Virama. */
OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
OT_Ra = 16, OT_Ra = 16,
OT_CM = 17, /* Consonant-Medial; Unused by Indic shaper. */ OT_CM = 17, /* Consonant-Medial. */
OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
OT_CS = 19 OT_CS = 19
}; };
#define MEDIAL_FLAGS (FLAG (OT_CM))
/* Note: /* Note:
* *
* We treat Vowels and placeholders as if they were consonants. This is safe because Vowels * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels
* cannot happen in a consonant syllable. The plus side however is, we can call the * cannot happen in a consonant syllable. The plus side however is, we can call the
* consonant syllable logic from the vowel syllable function and get it all right! */ * consonant syllable logic from the vowel syllable function and get it all right! */
#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE))
#define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ)) #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ))
@ -362,6 +364,7 @@ set_indic_properties (hb_glyph_info_t &info)
else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */ else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */ else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
else if (unlikely (u == 0x09FCu)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/1613 */
else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */ else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
cat = OT_PLACEHOLDER; cat = OT_PLACEHOLDER;

View File

@ -35,29 +35,27 @@
#line 36 "hb-ot-shape-complex-khmer-machine.hh" #line 36 "hb-ot-shape-complex-khmer-machine.hh"
static const unsigned char _khmer_syllable_machine_trans_keys[] = { static const unsigned char _khmer_syllable_machine_trans_keys[] = {
5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u,
5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u,
5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 16u, 1u, 29u, 5u, 29u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u,
5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 5u, 26u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u,
5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u,
5u, 29u, 0 0
}; };
static const char _khmer_syllable_machine_key_spans[] = { static const char _khmer_syllable_machine_key_spans[] = {
22, 17, 22, 17, 16, 17, 22, 17, 22, 17, 22, 17, 16, 17, 22, 17,
22, 17, 16, 17, 22, 17, 16, 17, 22, 17, 17, 22, 17, 16, 17, 22,
22, 17, 22, 17, 22, 16, 29, 25, 17, 22, 17, 22, 29, 25, 25, 25,
25, 25, 1, 18, 25, 25, 25, 22, 1, 18, 25, 25, 25, 16, 22, 25,
25, 25, 1, 18, 25, 25, 16, 25, 25, 1, 18, 25, 25, 16, 25, 25
25
}; };
static const short _khmer_syllable_machine_index_offsets[] = { static const short _khmer_syllable_machine_index_offsets[] = {
0, 23, 41, 64, 82, 99, 117, 140, 0, 23, 41, 64, 82, 99, 117, 140,
158, 181, 199, 216, 234, 257, 275, 292, 158, 181, 199, 217, 240, 258, 275, 293,
310, 333, 351, 374, 392, 415, 432, 462, 316, 334, 357, 375, 398, 428, 454, 480,
488, 514, 540, 542, 561, 587, 613, 639, 506, 508, 527, 553, 579, 605, 622, 645,
662, 688, 714, 716, 735, 761, 787, 804, 671, 697, 699, 718, 744, 770, 787, 813
830
}; };
static const char _khmer_syllable_machine_indicies[] = { static const char _khmer_syllable_machine_indicies[] = {
@ -85,142 +83,136 @@ static const char _khmer_syllable_machine_indicies[] = {
0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 0,
0, 0, 0, 4, 0, 11, 11, 0, 0, 0, 0, 4, 0, 11, 11, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 12, 0, 13, 0, 0, 0, 0, 0, 12, 0, 14,
13, 0, 0, 0, 0, 0, 0, 0, 14, 13, 13, 13, 13, 13, 13, 13,
0, 0, 0, 0, 0, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 15,
15, 15, 14, 14, 14, 14, 14, 14, 13, 14, 14, 16, 16, 16, 16, 16,
14, 14, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16,
16, 14, 15, 15, 17, 17, 17, 17, 16, 15, 16, 16, 16, 16, 17, 16,
17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 16, 16, 16, 16, 16, 16,
17, 17, 16, 17, 17, 17, 17, 18, 16, 16, 16, 16, 16, 16, 16, 16,
17, 19, 19, 17, 17, 17, 17, 17, 17, 16, 19, 19, 16, 16, 16, 16,
17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16,
17, 18, 17, 20, 20, 17, 17, 17, 16, 19, 16, 20, 20, 16, 16, 16,
17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 20, 17, 21, 21, 17, 17, 16, 16, 16, 21, 16, 22, 22, 16,
17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 17, 22, 17, 23, 23, 16, 16, 16, 16, 16, 23, 16, 16,
17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 17, 16, 22, 22, 16, 16,
17, 17, 17, 17, 17, 17, 24, 17, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 18, 17, 23, 23, 17, 16, 16, 16, 16, 23, 16, 24, 24,
17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 17, 17, 24, 17, 25, 16, 16, 16, 16, 16, 16, 25, 16,
25, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 17, 16, 24, 24, 16,
17, 17, 17, 17, 17, 17, 17, 26, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 17, 18, 17, 25, 25, 16, 16, 16, 16, 16, 25, 16, 14,
17, 17, 17, 17, 17, 17, 17, 17, 14, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 17, 17, 17, 26, 17, 16, 16, 16, 16, 16, 16, 26, 15,
15, 15, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 17, 16, 28, 28,
17, 17, 17, 17, 17, 17, 17, 27, 27, 27, 29, 29, 27, 27, 27, 27,
16, 17, 17, 17, 17, 18, 17, 28, 2, 2, 27, 30, 27, 28, 27, 27,
28, 17, 17, 17, 17, 17, 17, 17, 27, 27, 15, 19, 27, 27, 27, 17,
17, 17, 17, 17, 17, 17, 28, 17, 23, 25, 21, 27, 32, 32, 31, 31,
13, 13, 29, 29, 30, 30, 29, 29, 31, 31, 31, 31, 31, 33, 31, 31,
29, 29, 2, 2, 29, 31, 29, 13, 31, 31, 31, 2, 3, 6, 31, 31,
29, 29, 29, 29, 16, 20, 29, 29, 31, 4, 10, 12, 8, 31, 34, 34,
29, 18, 24, 26, 22, 29, 33, 33, 31, 31, 31, 31, 31, 31, 31, 35,
32, 32, 32, 32, 32, 32, 32, 34, 31, 31, 31, 31, 31, 31, 3, 6,
32, 32, 32, 32, 32, 2, 3, 6, 31, 31, 31, 4, 10, 12, 8, 31,
32, 32, 32, 4, 10, 12, 8, 32, 5, 5, 31, 31, 31, 31, 31, 31,
35, 35, 32, 32, 32, 32, 32, 32, 31, 35, 31, 31, 31, 31, 31, 31,
32, 36, 32, 32, 32, 32, 32, 32, 4, 6, 31, 31, 31, 31, 31, 31,
3, 6, 32, 32, 32, 4, 10, 12, 8, 31, 6, 31, 7, 7, 31, 31,
8, 32, 5, 5, 32, 32, 32, 32, 31, 31, 31, 31, 31, 35, 31, 31,
32, 32, 32, 36, 32, 32, 32, 32, 31, 31, 31, 31, 8, 6, 31, 36,
32, 32, 4, 6, 32, 32, 32, 32, 36, 31, 31, 31, 31, 31, 31, 31,
32, 32, 8, 32, 6, 32, 7, 7, 35, 31, 31, 31, 31, 31, 31, 10,
32, 32, 32, 32, 32, 32, 32, 36, 6, 31, 31, 31, 4, 31, 31, 8,
32, 32, 32, 32, 32, 32, 8, 6, 31, 37, 37, 31, 31, 31, 31, 31,
32, 37, 37, 32, 32, 32, 32, 32, 31, 31, 35, 31, 31, 31, 31, 31,
32, 32, 36, 32, 32, 32, 32, 32, 31, 12, 6, 31, 31, 31, 4, 10,
32, 10, 6, 32, 32, 32, 4, 32, 31, 8, 31, 34, 34, 31, 31, 31,
32, 8, 32, 38, 38, 32, 32, 32, 31, 31, 31, 31, 33, 31, 31, 31,
32, 32, 32, 32, 36, 32, 32, 32, 31, 31, 31, 3, 6, 31, 31, 31,
32, 32, 32, 12, 6, 32, 32, 32, 4, 10, 12, 8, 31, 28, 28, 31,
4, 10, 32, 8, 32, 35, 35, 32, 31, 31, 31, 31, 31, 31, 31, 31,
32, 32, 32, 32, 32, 32, 34, 32, 31, 31, 31, 31, 28, 31, 14, 14,
32, 32, 32, 32, 32, 3, 6, 32, 38, 38, 38, 38, 38, 38, 38, 38,
32, 32, 4, 10, 12, 8, 32, 15, 38, 38, 38, 38, 38, 38, 15, 38,
15, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 17, 38, 40, 40, 39,
39, 39, 39, 39, 39, 39, 39, 16, 39, 39, 39, 39, 39, 39, 41, 39,
39, 39, 39, 39, 18, 39, 41, 41, 39, 39, 39, 39, 39, 15, 19, 39,
40, 40, 40, 40, 40, 40, 40, 42, 39, 39, 17, 23, 25, 21, 39, 18,
40, 40, 40, 40, 40, 40, 16, 20, 18, 39, 39, 39, 39, 39, 39, 39,
40, 40, 40, 18, 24, 26, 22, 40, 41, 39, 39, 39, 39, 39, 39, 17,
19, 19, 40, 40, 40, 40, 40, 40, 19, 39, 39, 39, 39, 39, 39, 21,
40, 42, 40, 40, 40, 40, 40, 40, 39, 19, 39, 20, 20, 39, 39, 39,
18, 20, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 41, 39, 39, 39,
22, 40, 20, 40, 21, 21, 40, 40, 39, 39, 39, 21, 19, 39, 42, 42,
40, 40, 40, 40, 40, 42, 40, 40, 39, 39, 39, 39, 39, 39, 39, 41,
40, 40, 40, 40, 22, 20, 40, 43, 39, 39, 39, 39, 39, 39, 23, 19,
43, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 17, 39, 39, 21, 39,
42, 40, 40, 40, 40, 40, 40, 24, 43, 43, 39, 39, 39, 39, 39, 39,
20, 40, 40, 40, 18, 40, 40, 22, 39, 41, 39, 39, 39, 39, 39, 39,
40, 44, 44, 40, 40, 40, 40, 40, 25, 19, 39, 39, 39, 17, 23, 39,
40, 40, 42, 40, 40, 40, 40, 40, 21, 39, 44, 44, 39, 39, 39, 39,
40, 26, 20, 40, 40, 40, 18, 24,
40, 22, 40, 28, 28, 39, 39, 39,
39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
39, 39, 28, 39, 45, 45, 40, 40, 39, 44, 39, 45, 45, 39, 39, 39,
40, 40, 40, 40, 40, 46, 40, 40, 39, 39, 39, 39, 30, 39, 39, 39,
40, 40, 40, 27, 16, 20, 40, 40, 39, 39, 26, 15, 19, 39, 39, 39,
40, 18, 24, 26, 22, 40, 41, 41, 17, 23, 25, 21, 39, 40, 40, 39,
40, 40, 40, 40, 40, 40, 40, 46, 39, 39, 39, 39, 39, 39, 30, 39,
40, 40, 40, 40, 40, 40, 16, 20, 39, 39, 39, 39, 39, 15, 19, 39,
40, 40, 40, 18, 24, 26, 22, 40, 39, 39, 17, 23, 25, 21, 39, 0
0
}; };
static const char _khmer_syllable_machine_trans_targs[] = { static const char _khmer_syllable_machine_trans_targs[] = {
22, 1, 30, 24, 25, 3, 26, 5, 20, 1, 28, 22, 23, 3, 24, 5,
27, 7, 28, 9, 29, 23, 22, 11, 25, 7, 26, 9, 27, 20, 10, 31,
32, 22, 33, 13, 34, 15, 35, 17, 20, 32, 12, 33, 14, 34, 16, 35,
36, 19, 37, 40, 39, 22, 31, 38, 18, 36, 39, 20, 21, 30, 37, 20,
22, 0, 10, 2, 4, 6, 8, 22, 0, 29, 2, 4, 6, 8, 20, 20,
22, 12, 14, 16, 18, 20, 21 11, 13, 15, 17, 38, 19
}; };
static const char _khmer_syllable_machine_trans_actions[] = { static const char _khmer_syllable_machine_trans_actions[] = {
1, 0, 2, 2, 2, 0, 0, 0, 1, 0, 2, 2, 2, 0, 0, 0,
2, 0, 2, 0, 2, 2, 3, 0, 2, 0, 2, 0, 2, 3, 0, 4,
4, 5, 2, 0, 0, 0, 2, 0, 5, 2, 0, 0, 0, 2, 0, 2,
2, 0, 2, 4, 4, 8, 9, 0, 0, 2, 4, 8, 2, 9, 0, 10,
10, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, 12,
12, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 4, 0
}; };
static const char _khmer_syllable_machine_to_state_actions[] = { static const char _khmer_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, 6, 0, 0, 0, 0, 0, 6, 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 _khmer_syllable_machine_from_state_actions[] = { static const char _khmer_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, 7, 0, 0, 0, 0, 0, 7, 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 unsigned char _khmer_syllable_machine_eof_trans[] = { static const unsigned char _khmer_syllable_machine_eof_trans[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 15, 18, 18, 18, 18, 1, 1, 14, 17, 17, 17, 17, 17,
18, 18, 18, 18, 18, 18, 0, 33, 17, 17, 17, 17, 0, 32, 32, 32,
33, 33, 33, 33, 33, 33, 33, 40, 32, 32, 32, 32, 32, 32, 39, 40,
41, 41, 41, 41, 41, 41, 40, 41, 40, 40, 40, 40, 40, 40, 40, 40
41
}; };
static const int khmer_syllable_machine_start = 22; static const int khmer_syllable_machine_start = 20;
static const int khmer_syllable_machine_first_final = 22; static const int khmer_syllable_machine_first_final = 20;
static const int khmer_syllable_machine_error = -1; static const int khmer_syllable_machine_error = -1;
static const int khmer_syllable_machine_en_main = 22; static const int khmer_syllable_machine_en_main = 20;
#line 36 "hb-ot-shape-complex-khmer-machine.rl" #line 36 "hb-ot-shape-complex-khmer-machine.rl"
@ -246,7 +238,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 250 "hb-ot-shape-complex-khmer-machine.hh" #line 242 "hb-ot-shape-complex-khmer-machine.hh"
{ {
cs = khmer_syllable_machine_start; cs = khmer_syllable_machine_start;
ts = 0; ts = 0;
@ -262,7 +254,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int syllable_serial = 1; unsigned int syllable_serial = 1;
#line 266 "hb-ot-shape-complex-khmer-machine.hh" #line 258 "hb-ot-shape-complex-khmer-machine.hh"
{ {
int _slen; int _slen;
int _trans; int _trans;
@ -276,7 +268,7 @@ _resume:
#line 1 "NONE" #line 1 "NONE"
{ts = p;} {ts = p;}
break; break;
#line 280 "hb-ot-shape-complex-khmer-machine.hh" #line 272 "hb-ot-shape-complex-khmer-machine.hh"
} }
_keys = _khmer_syllable_machine_trans_keys + (cs<<1); _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@ -346,7 +338,7 @@ _eof_trans:
#line 76 "hb-ot-shape-complex-khmer-machine.rl" #line 76 "hb-ot-shape-complex-khmer-machine.rl"
{act = 3;} {act = 3;}
break; break;
#line 350 "hb-ot-shape-complex-khmer-machine.hh" #line 342 "hb-ot-shape-complex-khmer-machine.hh"
} }
_again: _again:
@ -355,7 +347,7 @@ _again:
#line 1 "NONE" #line 1 "NONE"
{ts = 0;} {ts = 0;}
break; break;
#line 359 "hb-ot-shape-complex-khmer-machine.hh" #line 351 "hb-ot-shape-complex-khmer-machine.hh"
} }
if ( ++p != pe ) if ( ++p != pe )

View File

@ -66,7 +66,7 @@ matra_group = VPre? xgroup VBlw? xgroup (joiner?.VAbv)? xgroup VPst?;
syllable_tail = xgroup matra_group xgroup (Coeng.c)? ygroup; syllable_tail = xgroup matra_group xgroup (Coeng.c)? ygroup;
broken_cluster = (Coeng.cn)* syllable_tail; broken_cluster = (Coeng.cn)* (Coeng | syllable_tail);
consonant_syllable = (cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster; consonant_syllable = (cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
other = any; other = any;

View File

@ -164,7 +164,7 @@ struct would_substitute_feature_t
hb_face_t *face) const hb_face_t *face) const
{ {
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context)) if (hb_ot_layout_lookup_would_substitute (face, lookups[i].index, glyphs, glyphs_count, zero_context))
return true; return true;
return false; return false;
} }
@ -365,6 +365,9 @@ 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)
{ {
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
return;
/* Note: This loop is extra overhead, but should not be measurable. */ /* Note: This loop is extra overhead, but should not be measurable. */
bool has_broken_syllables = false; bool has_broken_syllables = false;
unsigned int count = buffer->len; unsigned int count = buffer->len;

View File

@ -298,6 +298,9 @@ 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)
{ {
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
return;
/* Note: This loop is extra overhead, but should not be measurable. */ /* Note: This loop is extra overhead, but should not be measurable. */
bool has_broken_syllables = false; bool has_broken_syllables = false;
unsigned int count = buffer->len; unsigned int count = buffer->len;

View File

@ -6,12 +6,12 @@
* *
* on files with these headers: * on files with these headers:
* *
* # IndicSyllabicCategory-11.0.0.txt * # IndicSyllabicCategory-12.0.0.txt
* # Date: 2018-05-21, 18:33:00 GMT [KW, RP] * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
* # IndicPositionalCategory-11.0.0.txt * # IndicPositionalCategory-12.0.0.txt
* # Date: 2018-02-05, 16:21:00 GMT [KW, RP] * # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
* # Blocks-11.0.0.txt * # Blocks-12.0.0.txt
* # Date: 2017-10-16, 24:39:00 GMT [KW] * # Date: 2018-07-30, 19:40:00 GMT [KW]
* UnicodeData.txt does not have a header. * UnicodeData.txt does not have a header.
*/ */
@ -167,7 +167,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Kannada */ /* Kannada */
/* 0C80 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, /* 0C80 */ B, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
/* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv, /* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
@ -261,7 +261,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPst, VPst, /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPst, VPst,
/* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM, /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM,
/* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O, /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, FM, O, O,
/* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
#define use_offset_0x1900u 1936 #define use_offset_0x1900u 1936
@ -288,7 +288,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 19A0 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, /* 19A0 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O,
/* 19B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 19B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 19C0 */ B, B, B, B, B, B, B, B, VMPst, VMPst, O, O, O, O, O, O, /* 19C0 */ B, B, B, B, B, B, B, B, VMPst, VMPst, O, O, O, O, O, O,
/* 19D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 19D0 */ B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, O,
/* 19E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 19E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 19F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 19F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@ -351,7 +351,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1CD0 */ VMAbv, VMAbv, VMAbv, O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw, /* 1CD0 */ VMAbv, VMAbv, VMAbv, O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw,
/* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O, /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O,
/* 1CF0 */ O, O, VMPst, VMPst, VMAbv, CS, CS, VMPst, VMAbv, VMAbv, O, O, O, O, O, O, /* 1CF0 */ O, O, IND, IND, VMAbv, CS, CS, VMPst, VMAbv, VMAbv, GB, O, O, O, O, O,
#define use_offset_0x1df8u 2736 #define use_offset_0x1df8u 2736
@ -393,7 +393,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Syloti Nagri */ /* Syloti Nagri */
/* A800 */ B, B, O, B, B, B, VAbv, B, B, B, B, VMAbv, B, B, B, B, /* A800 */ B, B, VAbv, B, B, B, H, B, B, B, B, VMAbv, B, B, B, B,
/* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O, /* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O,
/* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@ -438,7 +438,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, /* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
/* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MBlw, /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, MBlw, MPst, MBlw,
/* A9C0 */ H, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* A9C0 */ H, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* A9D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* A9D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@ -581,7 +581,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Grantha */ /* Grantha */
/* 11300 */ VMAbv, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, B, B, O, O, B, /* 11300 */ VMAbv, VMAbv, VMAbv, VMAbv, O, B, B, B, B, B, B, B, B, O, O, B,
/* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 11330 */ B, O, B, B, O, B, B, B, B, B, O, CMBlw, CMBlw, B, VPst, VPst, /* 11330 */ B, O, B, B, O, B, B, B, B, B, O, CMBlw, CMBlw, B, VPst, VPst,
@ -600,7 +600,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv,
/* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O, /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O,
/* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FM, O, /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FM, B,
/* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@ -610,7 +610,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPst, VPst, VPst, VPst, VMAbv, /* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPst, VPst, VPst, VPst, VMAbv,
/* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O, /* 114C0 */ VMAbv, VMAbv, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O,
/* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
#define use_offset_0x11580u 4720 #define use_offset_0x11580u 4720
@ -643,7 +643,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst, /* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst,
/* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, O, O, O, O, O, O, O, O, /* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, B, O, O, O, O, O, O, O,
/* 116C0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 116C0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* 116D0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 116D0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 116E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 116E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@ -666,9 +666,18 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11820 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPre, VPst, VBlw, /* 11820 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPre, VPst, VBlw,
/* 11830 */ VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VMAbv, VMPst, H, CMBlw, O, O, O, O, O, /* 11830 */ VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VMAbv, VMPst, H, CMBlw, O, O, O, O, O,
#define use_offset_0x11a00u 5232 #define use_offset_0x119a0u 5232
/* Nandinagari */
/* 119A0 */ B, B, B, B, B, B, B, B, O, O, B, B, B, B, B, B,
/* 119B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 119C0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 119D0 */ B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VAbv, VAbv, VPst, VPst, VMPst, VMPst,
/* 119E0 */ H, B, O, O, VPre, O, O, O, O, O, O, O, O, O, O, O,
/* 119F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Zanabazar Square */ /* Zanabazar Square */
/* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B, /* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B,
@ -682,10 +691,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11A50 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VBlw, VBlw, VBlw, B, B, B, B, /* 11A50 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VBlw, VBlw, VBlw, B, B, B, B,
/* 11A60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11A60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11A70 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11A70 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11A80 */ B, B, B, B, O, O, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, /* 11A80 */ B, B, B, B, R, R, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw,
/* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, B, O, O, /* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, B, O, O,
#define use_offset_0x11c00u 5392 #define use_offset_0x11c00u 5488
/* Bhaiksuki */ /* Bhaiksuki */
@ -706,7 +715,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
/* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O, /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O,
#define use_offset_0x11d00u 5576 #define use_offset_0x11d00u 5672
/* Masaram Gondi */ /* Masaram Gondi */
@ -726,7 +735,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11D90 */ VAbv, VAbv, O, VPst, VPst, VMAbv, VMPst, H, O, O, O, O, O, O, O, O, /* 11D90 */ VAbv, VAbv, O, VPst, VPst, VMAbv, VMPst, H, O, O, O, O, O, O, O, O,
/* 11DA0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 11DA0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
#define use_offset_0x11ee0u 5752 #define use_offset_0x11ee0u 5848
/* Makasar */ /* Makasar */
@ -734,7 +743,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11EE0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11EE0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11EF0 */ B, B, GB, VAbv, VBlw, VPre, VPst, O, /* 11EF0 */ B, B, GB, VAbv, VBlw, VPre, VPst, O,
}; /* Table items: 5776; occupancy: 74% */ }; /* Table items: 5872; occupancy: 74% */
USE_TABLE_ELEMENT_TYPE USE_TABLE_ELEMENT_TYPE
hb_use_get_category (hb_codepoint_t u) hb_use_get_category (hb_codepoint_t u)
@ -785,7 +794,7 @@ hb_use_get_category (hb_codepoint_t u)
if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u]; if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u]; if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
if (hb_in_range<hb_codepoint_t> (u, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u]; if (hb_in_range<hb_codepoint_t> (u, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u]; if (hb_in_range<hb_codepoint_t> (u, 0x119A0u, 0x11A9Fu)) return use_table[u - 0x119A0u + use_offset_0x119a0u];
if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u]; if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u]; if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u]; if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];

View File

@ -523,6 +523,9 @@ 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)
{ {
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
return;
/* Note: This loop is extra overhead, but should not be measurable. */ /* Note: This loop is extra overhead, but should not be measurable. */
bool has_broken_syllables = false; bool has_broken_syllables = false;
unsigned int count = buffer->len; unsigned int count = buffer->len;

View File

@ -9,8 +9,8 @@
* # Copied from https://docs.microsoft.com/en-us/typography/script-development/use * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
* # On October 23, 2018; with documentd dated 02/07/2018. * # On October 23, 2018; with documentd dated 02/07/2018.
* *
* # Scripts-11.0.0.txt * # Scripts-12.0.0.txt
* # Date: 2018-02-21, 05:34:31 GMT * # Date: 2019-01-28, 22:16:47 GMT
*/ */
#include "hb-ot-shape-complex-vowel-constraints.hh" #include "hb-ot-shape-complex-vowel-constraints.hh"
@ -34,6 +34,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_buffer_t *buffer, hb_buffer_t *buffer,
hb_font_t *font HB_UNUSED) hb_font_t *font HB_UNUSED)
{ {
if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
return;
/* UGLY UGLY UGLY business of adding dotted-circle in the middle of /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
* vowel-sequences that look like another vowel. Data for each script * vowel-sequences that look like another vowel. Data for each script
* collected from the USE script development spec. * collected from the USE script development spec.

View File

@ -377,6 +377,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
case HB_SCRIPT_MAKASAR: case HB_SCRIPT_MAKASAR:
//case HB_SCRIPT_SOGDIAN: //case HB_SCRIPT_SOGDIAN:
/* Unicode-12.0 additions */
case HB_SCRIPT_NANDINAGARI:
/* 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.
* Otherwise, use the specific shaper. * Otherwise, use the specific shaper.

View File

@ -448,6 +448,9 @@ hb_set_unicode_props (hb_buffer_t *buffer)
static void static void
hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font) hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
{ {
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
return;
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_is_unicode_mark (&buffer->info[0])) !_hb_glyph_info_is_unicode_mark (&buffer->info[0]))

View File

@ -6,8 +6,8 @@
* *
* on files with these headers: * on files with these headers:
* *
* <meta name="updated_at" content="2018-09-07 07:45 PM" /> * <meta name="updated_at" content="2018-11-18 05:25 AM" />
* File-Date: 2018-08-08 * File-Date: 2019-02-20
*/ */
#ifndef HB_OT_TAG_TABLE_HH #ifndef HB_OT_TAG_TABLE_HH
@ -131,7 +131,7 @@ static const LangTag ot_languages[] = {
{"bjt", {HB_TAG('B','L','N',' ')}}, /* Balanta-Ganja -> Balante */ {"bjt", {HB_TAG('B','L','N',' ')}}, /* Balanta-Ganja -> Balante */
{"bla", {HB_TAG('B','K','F',' ')}}, /* Siksika -> Blackfoot */ {"bla", {HB_TAG('B','K','F',' ')}}, /* Siksika -> Blackfoot */
{"ble", {HB_TAG('B','L','N',' ')}}, /* Balanta-Kentohe -> Balante */ {"ble", {HB_TAG('B','L','N',' ')}}, /* Balanta-Kentohe -> Balante */
{"blk", {HB_TAG('B','L','K',' ')}}, /* Pa'o Karen */ {"blk", {HB_TAG('B','L','K',' ')}}, /* Pao Karen */
{"bln", {HB_TAG('B','I','K',' ')}}, /* Southern Catanduanes Bikol -> Bikol */ {"bln", {HB_TAG('B','I','K',' ')}}, /* Southern Catanduanes Bikol -> Bikol */
{"bm", {HB_TAG('B','M','B',' ')}}, /* Bambara (Bamanankan) */ {"bm", {HB_TAG('B','M','B',' ')}}, /* Bambara (Bamanankan) */
{"bmm", {HB_TAG('M','L','G',' ')}}, /* Northern Betsimisaraka Malagasy -> Malagasy */ {"bmm", {HB_TAG('M','L','G',' ')}}, /* Northern Betsimisaraka Malagasy -> Malagasy */
@ -318,7 +318,7 @@ static const LangTag ot_languages[] = {
{"fj", {HB_TAG('F','J','I',' ')}}, /* Fijian */ {"fj", {HB_TAG('F','J','I',' ')}}, /* Fijian */
{"flm", {HB_TAG('H','A','L',' '), /* Halam (Falam Chin) (retired code) */ {"flm", {HB_TAG('H','A','L',' '), /* Halam (Falam Chin) (retired code) */
HB_TAG('Q','I','N',' ')}}, /* Falam Chin (retired code) -> Chin */ HB_TAG('Q','I','N',' ')}}, /* Falam Chin (retired code) -> Chin */
{"fmp", {HB_TAG('F','M','P',' ')}}, /* Fe'fe' */ {"fmp", {HB_TAG('F','M','P',' ')}}, /* Fefe */
{"fo", {HB_TAG('F','O','S',' ')}}, /* Faroese */ {"fo", {HB_TAG('F','O','S',' ')}}, /* Faroese */
{"fon", {HB_TAG('F','O','N',' ')}}, /* Fon */ {"fon", {HB_TAG('F','O','N',' ')}}, /* Fon */
{"fr", {HB_TAG('F','R','A',' ')}}, /* French */ {"fr", {HB_TAG('F','R','A',' ')}}, /* French */
@ -653,7 +653,7 @@ static const LangTag ot_languages[] = {
{"mwr", {HB_TAG('M','A','W',' ')}}, /* Marwari [macrolanguage] */ {"mwr", {HB_TAG('M','A','W',' ')}}, /* Marwari [macrolanguage] */
{"mww", {HB_TAG('M','W','W',' ')}}, /* Hmong Daw */ {"mww", {HB_TAG('M','W','W',' ')}}, /* Hmong Daw */
{"my", {HB_TAG('B','R','M',' ')}}, /* Burmese */ {"my", {HB_TAG('B','R','M',' ')}}, /* Burmese */
{"mym", {HB_TAG('M','E','N',' ')}}, /* Me'en */ {"mym", {HB_TAG('M','E','N',' ')}}, /* Meen */
{"myn", {HB_TAG('M','Y','N',' ')}}, /* Mayan [family] */ {"myn", {HB_TAG('M','Y','N',' ')}}, /* Mayan [family] */
{"myq", {HB_TAG('M','N','K',' ')}}, /* Forest Maninka (retired code) -> Maninka */ {"myq", {HB_TAG('M','N','K',' ')}}, /* Forest Maninka (retired code) -> Maninka */
{"myv", {HB_TAG('E','R','Z',' ')}}, /* Erzya */ {"myv", {HB_TAG('E','R','Z',' ')}}, /* Erzya */
@ -687,7 +687,7 @@ static const LangTag ot_languages[] = {
{"nog", {HB_TAG('N','O','G',' ')}}, /* Nogai */ {"nog", {HB_TAG('N','O','G',' ')}}, /* Nogai */
{"nov", {HB_TAG('N','O','V',' ')}}, /* Novial */ {"nov", {HB_TAG('N','O','V',' ')}}, /* Novial */
{"npi", {HB_TAG('N','E','P',' ')}}, /* Nepali */ {"npi", {HB_TAG('N','E','P',' ')}}, /* Nepali */
{"nqo", {HB_TAG('N','K','O',' ')}}, /* N'Ko */ {"nqo", {HB_TAG('N','K','O',' ')}}, /* NKo */
{"nr", {HB_TAG('N','D','B',' ')}}, /* South Ndebele -> Ndebele */ {"nr", {HB_TAG('N','D','B',' ')}}, /* South Ndebele -> Ndebele */
{"nsk", {HB_TAG('N','A','S',' ')}}, /* Naskapi */ {"nsk", {HB_TAG('N','A','S',' ')}}, /* Naskapi */
{"nso", {HB_TAG('N','S','O',' ')}}, /* Pedi -> Sotho, Northern */ {"nso", {HB_TAG('N','S','O',' ')}}, /* Pedi -> Sotho, Northern */

View File

@ -171,24 +171,6 @@ hb_ot_tag_to_script (hb_tag_t tag)
/* hb_language_t */ /* hb_language_t */
static int
lang_compare_first_component (const void *pa,
const void *pb)
{
const char *a = (const char *) pa;
const char *b = (const char *) pb;
unsigned int da, db;
const char *p;
p = strchr (a, '-');
da = p ? (unsigned int) (p - a) : strlen (a);
p = strchr (b, '-');
db = p ? (unsigned int) (p - b) : strlen (b);
return strncmp (a, b, MAX (da, db));
}
static bool static bool
subtag_matches (const char *lang_str, subtag_matches (const char *lang_str,
const char *limit, const char *limit,
@ -213,10 +195,28 @@ lang_matches (const char *lang_str, const char *spec)
(lang_str[len] == '\0' || lang_str[len] == '-'); (lang_str[len] == '\0' || lang_str[len] == '-');
} }
typedef struct { struct LangTag
{
char language[4]; char language[4];
hb_tag_t tags[HB_OT_MAX_TAGS_PER_LANGUAGE]; hb_tag_t tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
} LangTag;
int cmp (const char *a) const
{
const char *b = this->language;
unsigned int da, db;
const char *p;
p = strchr (a, '-');
da = p ? (unsigned int) (p - a) : strlen (a);
p = strchr (b, '-');
db = p ? (unsigned int) (p - b) : strlen (b);
return strncmp (a, b, MAX (da, db));
}
int cmp (const LangTag *that) const
{ return cmp (that->language); }
};
#include "hb-ot-tag-table.hh" #include "hb-ot-tag-table.hh"
@ -263,9 +263,7 @@ hb_ot_tags_from_language (const char *lang_str,
ISALPHA (s[1])) ISALPHA (s[1]))
lang_str = s + 1; lang_str = s + 1;
} }
lang_tag = (LangTag *) bsearch (lang_str, ot_languages, lang_tag = hb_sorted_array (ot_languages).bsearch (lang_str);
ARRAY_LENGTH (ot_languages), sizeof (LangTag),
lang_compare_first_component);
if (lang_tag) if (lang_tag)
{ {
unsigned int i; unsigned int i;
@ -507,7 +505,7 @@ test_langs_sorted ()
{ {
for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++) for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
{ {
int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language); int c = ot_languages[i].cmp (&ot_languages[i - 1]);
if (c >= 0) if (c >= 0)
{ {
fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n", fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",

View File

@ -96,10 +96,10 @@ _remove_invalid_gids (hb_set_t *glyphs,
static hb_set_t * static hb_set_t *
_populate_gids_to_retain (hb_face_t *face, _populate_gids_to_retain (hb_face_t *face,
const hb_set_t *unicodes, const hb_set_t *unicodes,
const hb_set_t *input_glyphs_to_retain,
bool close_over_gsub, bool close_over_gsub,
hb_set_t *unicodes_to_retain, hb_set_t *unicodes_to_retain,
hb_map_t *codepoint_to_glyph, hb_map_t *codepoint_to_glyph)
hb_vector_t<hb_codepoint_t> *glyphs)
{ {
OT::cmap::accelerator_t cmap; OT::cmap::accelerator_t cmap;
OT::glyf::accelerator_t glyf; OT::glyf::accelerator_t glyf;
@ -110,6 +110,7 @@ _populate_gids_to_retain (hb_face_t *face,
hb_set_t *initial_gids_to_retain = hb_set_create (); hb_set_t *initial_gids_to_retain = hb_set_create ();
initial_gids_to_retain->add (0); // Not-def initial_gids_to_retain->add (0); // Not-def
hb_set_union (initial_gids_to_retain, input_glyphs_to_retain);
hb_codepoint_t cp = HB_SET_VALUE_INVALID; hb_codepoint_t cp = HB_SET_VALUE_INVALID;
while (unicodes->next (&cp)) while (unicodes->next (&cp))
@ -143,10 +144,6 @@ _populate_gids_to_retain (hb_face_t *face,
_remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ()); _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ());
glyphs->alloc (all_gids_to_retain->get_population ());
gid = HB_SET_VALUE_INVALID;
while (all_gids_to_retain->next (&gid))
glyphs->push (gid);
cff.fini (); cff.fini ();
glyf.fini (); glyf.fini ();
@ -158,26 +155,29 @@ _populate_gids_to_retain (hb_face_t *face,
static void static void
_create_old_gid_to_new_gid_map (const hb_face_t *face, _create_old_gid_to_new_gid_map (const hb_face_t *face,
bool retain_gids, bool retain_gids,
const hb_vector_t<hb_codepoint_t> &glyphs, hb_set_t *all_gids_to_retain,
hb_map_t *glyph_map, /* OUT */ hb_map_t *glyph_map, /* OUT */
hb_map_t *reverse_glyph_map, /* OUT */ hb_map_t *reverse_glyph_map, /* OUT */
unsigned int *num_glyphs /* OUT */) unsigned int *num_glyphs /* OUT */)
{ {
for (unsigned int i = 0; i < glyphs.length; i++) { hb_codepoint_t gid = HB_SET_VALUE_INVALID;
unsigned int length = 0;
for (unsigned int i = 0; all_gids_to_retain->next (&gid); i++) {
if (!retain_gids) if (!retain_gids)
{ {
glyph_map->set (glyphs[i], i); glyph_map->set (gid, i);
reverse_glyph_map->set (i, glyphs[i]); reverse_glyph_map->set (i, gid);
} }
else else
{ {
glyph_map->set (glyphs[i], glyphs[i]); glyph_map->set (gid, gid);
reverse_glyph_map->set (glyphs[i], glyphs[i]); reverse_glyph_map->set (gid, gid);
} }
++length;
} }
if (!retain_gids || glyphs.length == 0) if (!retain_gids || length == 0)
{ {
*num_glyphs = glyphs.length; *num_glyphs = length;
} }
else else
{ {
@ -205,7 +205,6 @@ hb_subset_plan_create (hb_face_t *face,
plan->drop_layout = input->drop_layout; plan->drop_layout = input->drop_layout;
plan->desubroutinize = input->desubroutinize; plan->desubroutinize = input->desubroutinize;
plan->unicodes = hb_set_create(); plan->unicodes = hb_set_create();
plan->glyphs_deprecated.init();
plan->source = hb_face_reference (face); plan->source = hb_face_reference (face);
plan->dest = hb_face_builder_create (); plan->dest = hb_face_builder_create ();
plan->codepoint_to_glyph = hb_map_create(); plan->codepoint_to_glyph = hb_map_create();
@ -213,14 +212,14 @@ hb_subset_plan_create (hb_face_t *face,
plan->reverse_glyph_map = hb_map_create(); plan->reverse_glyph_map = hb_map_create();
plan->_glyphset = _populate_gids_to_retain (face, plan->_glyphset = _populate_gids_to_retain (face,
input->unicodes, input->unicodes,
input->glyphs,
!plan->drop_layout, !plan->drop_layout,
plan->unicodes, plan->unicodes,
plan->codepoint_to_glyph, plan->codepoint_to_glyph);
&plan->glyphs_deprecated);
_create_old_gid_to_new_gid_map (face, _create_old_gid_to_new_gid_map (face,
input->retain_gids, input->retain_gids,
plan->glyphs_deprecated, plan->_glyphset,
plan->glyph_map, plan->glyph_map,
plan->reverse_glyph_map, plan->reverse_glyph_map,
&plan->_num_output_glyphs); &plan->_num_output_glyphs);
@ -239,7 +238,6 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan)
if (!hb_object_destroy (plan)) return; if (!hb_object_destroy (plan)) return;
hb_set_destroy (plan->unicodes); hb_set_destroy (plan->unicodes);
plan->glyphs_deprecated.fini ();
hb_face_destroy (plan->source); hb_face_destroy (plan->source);
hb_face_destroy (plan->dest); hb_face_destroy (plan->dest);
hb_map_destroy (plan->codepoint_to_glyph); hb_map_destroy (plan->codepoint_to_glyph);

View File

@ -53,9 +53,6 @@ struct hb_subset_plan_t
hb_map_t *glyph_map; hb_map_t *glyph_map;
hb_map_t *reverse_glyph_map; hb_map_t *reverse_glyph_map;
// Deprecated members:
hb_vector_t<hb_codepoint_t> glyphs_deprecated;
// Plan is only good for a specific source/dest so keep them with it // Plan is only good for a specific source/dest so keep them with it
hb_face_t *source; hb_face_t *source;
hb_face_t *dest; hb_face_t *dest;

View File

@ -171,6 +171,10 @@ static const hb_script_t ucdn_script_translate[] =
HB_SCRIPT_MEDEFAIDRIN, HB_SCRIPT_MEDEFAIDRIN,
HB_SCRIPT_OLD_SOGDIAN, HB_SCRIPT_OLD_SOGDIAN,
HB_SCRIPT_SOGDIAN, HB_SCRIPT_SOGDIAN,
HB_SCRIPT_ELYMAIC,
HB_SCRIPT_NANDINAGARI,
HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
HB_SCRIPT_WANCHO,
}; };
static hb_unicode_combining_class_t static hb_unicode_combining_class_t

View File

@ -206,6 +206,17 @@ typedef unsigned __int64 uint64_t;
#define UCDN_SCRIPT_NUSHU 139 #define UCDN_SCRIPT_NUSHU 139
#define UCDN_SCRIPT_SOYOMBO 140 #define UCDN_SCRIPT_SOYOMBO 140
#define UCDN_SCRIPT_ZANABAZAR_SQUARE 141 #define UCDN_SCRIPT_ZANABAZAR_SQUARE 141
#define UCDN_SCRIPT_DOGRA 142
#define UCDN_SCRIPT_GUNJALA_GONDI 143
#define UCDN_SCRIPT_HANIFI_ROHINGYA 144
#define UCDN_SCRIPT_MAKASAR 145
#define UCDN_SCRIPT_MEDEFAIDRIN 146
#define UCDN_SCRIPT_OLD_SOGDIAN 147
#define UCDN_SCRIPT_SOGDIAN 148
#define UCDN_SCRIPT_ELYMAIC 149
#define UCDN_SCRIPT_NANDINAGARI 150
#define UCDN_SCRIPT_NYIAKENG_PUACHUE_HMONG 151
#define UCDN_SCRIPT_WANCHO 152
#define UCDN_LINEBREAK_CLASS_OP 0 #define UCDN_LINEBREAK_CLASS_OP 0
#define UCDN_LINEBREAK_CLASS_CL 1 #define UCDN_LINEBREAK_CLASS_CL 1

File diff suppressed because it is too large Load Diff

View File

@ -7,13 +7,13 @@
* on file with this header: * on file with this header:
* *
* # emoji-data.txt * # emoji-data.txt
* # Date: 2018-02-07, 07:55:18 GMT * # Date: 2019-01-15, 12:10:05 GMT
* # © 2018 Unicode®, Inc. * # © 2019 Unicode®, Inc.
* # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. * # 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 * # For terms of use, see http://www.unicode.org/terms_of_use.html
* # * #
* # Emoji Data for UTS #51 * # Emoji Data for UTS #51
* # Version: 11.0 * # Version: 12.0
* # * #
* # For documentation and usage, see http://www.unicode.org/reports/tr51 * # For documentation and usage, see http://www.unicode.org/reports/tr51
*/ */

View File

@ -37,10 +37,10 @@ HB_BEGIN_DECLS
#define HB_VERSION_MAJOR 2 #define HB_VERSION_MAJOR 2
#define HB_VERSION_MINOR 3 #define HB_VERSION_MINOR 4
#define HB_VERSION_MICRO 1 #define HB_VERSION_MICRO 0
#define HB_VERSION_STRING "2.3.1" #define HB_VERSION_STRING "2.4.0"
#define HB_VERSION_ATLEAST(major,minor,micro) \ #define HB_VERSION_ATLEAST(major,minor,micro) \
((major)*10000+(minor)*100+(micro) <= \ ((major)*10000+(minor)*100+(micro) <= \

View File

@ -215,7 +215,8 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size);
* Compiler attributes * Compiler attributes
*/ */
#if __cplusplus < 201103L /* https://github.com/harfbuzz/harfbuzz/issues/1634 */
#if __cplusplus < 201103L && !defined(_MSC_VER)
#ifndef nullptr #ifndef nullptr
#define nullptr NULL #define nullptr NULL

BIN
test/api/fonts/Zycon.ttf Normal file

Binary file not shown.

View File

@ -48,7 +48,7 @@ typedef short bool;
HB_BEGIN_DECLS HB_BEGIN_DECLS
static inline hb_subset_input_t * static inline hb_subset_input_t *
hb_subset_test_create_input(const hb_set_t *codepoints) hb_subset_test_create_input (const hb_set_t *codepoints)
{ {
hb_subset_input_t *input = hb_subset_input_create_or_fail (); hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t * input_codepoints = hb_subset_input_unicode_set (input); hb_set_t * input_codepoints = hb_subset_input_unicode_set (input);
@ -56,6 +56,15 @@ hb_subset_test_create_input(const hb_set_t *codepoints)
return input; return input;
} }
static inline hb_subset_input_t *
hb_subset_test_create_input_from_glyphs (const hb_set_t *glyphs)
{
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t * input_glyphs = hb_subset_input_glyph_set (input);
hb_set_union (input_glyphs, glyphs);
return input;
}
static inline hb_face_t * static inline hb_face_t *
hb_subset_test_create_subset (hb_face_t *source, hb_subset_test_create_subset (hb_face_t *source,
hb_subset_input_t *input) hb_subset_input_t *input)

View File

@ -110,12 +110,21 @@ test_ot_face_empty (void)
test_face (hb_face_get_empty (), 0); test_face (hb_face_get_empty (), 0);
} }
static void
test_ot_var_axis_on_zero_named_instance ()
{
hb_face_t *face = hb_test_open_font_file ("fonts/Zycon.ttf");
g_assert (hb_ot_var_get_axis_count (face));
hb_face_destroy (face);
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
hb_test_init (&argc, &argv); hb_test_init (&argc, &argv);
hb_test_add (test_ot_face_empty); hb_test_add (test_ot_face_empty);
hb_test_add (test_ot_var_axis_on_zero_named_instance);
return hb_test_run(); return hb_test_run();
} }

View File

@ -79,6 +79,29 @@ test_subset_glyf (void)
hb_face_destroy (face_ac); hb_face_destroy (face_ac);
} }
static void
test_subset_glyf_with_input_glyphs (void)
{
hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.ttf");
hb_set_t *glyphs = hb_set_create();
hb_face_t *face_abc_subset;
hb_set_add (glyphs, 1);
hb_set_add (glyphs, 3);
face_abc_subset =
hb_subset_test_create_subset (face_abc, hb_subset_test_create_input_from_glyphs (glyphs));
hb_set_destroy (glyphs);
hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('g','l','y','f'));
hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('l','o','c', 'a'));
check_maxp_num_glyphs(face_abc_subset, 3, true);
hb_face_destroy (face_abc_subset);
hb_face_destroy (face_abc);
hb_face_destroy (face_ac);
}
static void static void
test_subset_glyf_with_components (void) test_subset_glyf_with_components (void)
{ {
@ -291,6 +314,7 @@ main (int argc, char **argv)
hb_test_add (test_subset_glyf_noop); hb_test_add (test_subset_glyf_noop);
hb_test_add (test_subset_glyf); hb_test_add (test_subset_glyf);
hb_test_add (test_subset_glyf_with_input_glyphs);
hb_test_add (test_subset_glyf_strip_hints_simple); hb_test_add (test_subset_glyf_strip_hints_simple);
hb_test_add (test_subset_glyf_strip_hints_composite); hb_test_add (test_subset_glyf_strip_hints_composite);
hb_test_add (test_subset_glyf_strip_hints_invalid); hb_test_add (test_subset_glyf_strip_hints_invalid);

View File

@ -6,3 +6,5 @@
../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+0A51:[uni25CC=0+1044|udaatguru=0+0] ../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+0A51:[uni25CC=0+1044|udaatguru=0+0]
../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+25CC,U+0A51:[uni25CC=0+1044|udaatguru=0+0] ../fonts/1735326da89f0818cd8c51a0600e9789812c0f94.ttf::U+25CC,U+0A51:[uni25CC=0+1044|udaatguru=0+0]
../fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf:--no-glyph-names:U+0C80,U+0C82:[1=0+502|2=0+502] ../fonts/81c368a33816fb20e9f647e8f24e2180f4720263.ttf:--no-glyph-names:U+0C80,U+0C82:[1=0+502|2=0+502]
../fonts/f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf::U+0A20,U+0A75,U+0A47:[tthaguru=0+1352|yakashguru=0@-90,0+0|eematraguru=0@-411,0+0]
../fonts/f75c4b05a0a4d67c1a808081ae3d74a9c66509e8.ttf::U+0A20,U+0A75,U+0A42:[tthaguru=0+1352|yakashuuguru=0+0]

View File

@ -87,3 +87,4 @@
../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17C0:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17C0.right1.high=0+288] ../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17C0:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17C0.right1.high=0+288]
../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+1784,U+17D2,U+1780:[uni17D2179A=0+287|uni17A0=0+928|uni17D2179C=0@20,-26+0|uni1784=5+635|uni17D21780=5@0,-26+0] ../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+1784,U+17D2,U+1780:[uni17D2179A=0+287|uni17A0=0+928|uni17D2179C=0@20,-26+0|uni1784=5+635|uni17D21780=5@0,-26+0]
../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+17B6,U+17C6,U+1784:[uni17D2179A=0+287|uni17A017B6=0+1216|uni17D2179C=0@-268,-26+0|uni17C6=0@47,-29+0|uni1784=7+635] ../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+17B6,U+17C6,U+1784:[uni17D2179A=0+287|uni17A017B6=0+1216|uni17D2179C=0@-268,-26+0|uni17C6=0@47,-29+0|uni1784=7+635]
../fonts/ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf::U+17D2,U+17D2:[uni25CC=0+635|uni17D2=0+0|uni25CC=0+635|uni17D2=0+0]

View File

@ -35,3 +35,22 @@
/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0@46,0+1147|gid658=1@-89,0+1006|gid3=2@46,0+512|gid4=3@46,0+1319|gid332=4@-19,0+1319|gid3=5@46,0+512|gid282=6@46,0+1167|gid813=7@-69,0+608|gid3=8@46,0+512|gid332=9@46,0+1309|gid572=10@-29,0+1045|gid3=11@46,0+512|gid813=12@46,0+638|gid282=13@-39,0+1197|gid3=14@46,0+512|gid658=15@46,0+1006|gid282=16@-89,0+1147|gid3=17@46,0+512|gid282=18@46,0+1147|gid649=19@-89,0+1091] /System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0@46,0+1147|gid658=1@-89,0+1006|gid3=2@46,0+512|gid4=3@46,0+1319|gid332=4@-19,0+1319|gid3=5@46,0+512|gid282=6@46,0+1167|gid813=7@-69,0+608|gid3=8@46,0+512|gid332=9@46,0+1309|gid572=10@-29,0+1045|gid3=11@46,0+512|gid813=12@46,0+638|gid282=13@-39,0+1197|gid3=14@46,0+512|gid658=15@46,0+1006|gid282=16@-89,0+1147|gid3=17@46,0+512|gid282=18@46,0+1147|gid649=19@-89,0+1091]
/System/Library/Fonts/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] /System/Library/Fonts/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
/Library/Fonts/Zapfino.ttf@99a1e15163c3e9567d5b1019c45e9254dae63b08:--font-funcs ot:U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+006F:[Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|Z=6+416|a=7@-21,0+264|p_f=8+433|i=10+181|n=11+261|Z=12+416|a=13@-21,0+264|p_f=14+433|i=16+181|n=17+261|Z=18+416|a=19@-21,0+264|p_f=20+433|i=22+181|n=23+261|Z=24+416|a=25@-21,0+264|p_f=26+433|i=28+181|n=29+261|Z=30+416|a=31@-21,0+264|p_f=32+433|i=34+181|n=35+261|Z=36+416|a=37@-21,0+264|p_f=38+433|i=40+181|n=41+261|Z=42+416|a=43@-21,0+264|p_f=44+433|i=46+181|n=47+261|Z=48+416|a=49@-21,0+264|p_f=50+433|i=52+181|n=53+261|Z=54+416|a=55@-21,0+264|p_f=56+433|i=58+181|n=59+261|Z=60+416|a=61@-21,0+264|p_f=62+433|i=64+181|n=65+261|Z_a_p_f_i_n_o=66+2333] /Library/Fonts/Zapfino.ttf@99a1e15163c3e9567d5b1019c45e9254dae63b08:--font-funcs ot:U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+006F:[Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|Z=6+416|a=7@-21,0+264|p_f=8+433|i=10+181|n=11+261|Z=12+416|a=13@-21,0+264|p_f=14+433|i=16+181|n=17+261|Z=18+416|a=19@-21,0+264|p_f=20+433|i=22+181|n=23+261|Z=24+416|a=25@-21,0+264|p_f=26+433|i=28+181|n=29+261|Z=30+416|a=31@-21,0+264|p_f=32+433|i=34+181|n=35+261|Z=36+416|a=37@-21,0+264|p_f=38+433|i=40+181|n=41+261|Z=42+416|a=43@-21,0+264|p_f=44+433|i=46+181|n=47+261|Z=48+416|a=49@-21,0+264|p_f=50+433|i=52+181|n=53+261|Z=54+416|a=55@-21,0+264|p_f=56+433|i=58+181|n=59+261|Z=60+416|a=61@-21,0+264|p_f=62+433|i=64+181|n=65+261|Z_a_p_f_i_n_o=66+2333]
# 10.14.2 https://gist.github.com/ebraminio/4b731a82f11a662b2164622ebb93086a
/System/Library/Fonts/Helvetica.ttc@992d29a0fa4ed91773457c29b661e94843619cde:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
/Library/Fonts/Khmer MN.ttc@37687fe0bd2548e08e29c92a30e476367ae6356b:--font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1230|km_ka=1+1230|km_sa.sub=1+620|km_ro=4+712|km_vs_ae=5+726|km_kha=5+1230|km_mo.sub=5+0|km_ro=9+712]
/Library/Fonts/Tamil MN.ttc@e1df5e056be08937fd65990efbafff0814c03677:--font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833]
/System/Library/Fonts/Times.ttc@ebb050e4fcaaebe9992efbc7b5660b60ba18b518:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-551,588+0|fi=3+1139|Z=5+1251]
/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006]
/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656]
/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700]
/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
/System/Library/Fonts/SFNSDisplay.ttf@6e9677c443f6583228a63fd147663cfc635924d9:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid283=0+1055|gid659=1@-135,0+914|gid3=2+420|gid4=3+1227|gid333=4@-65,0+1227|gid3=5+420|gid283=6+1075|gid815=7@-115,0+516|gid3=8+420|gid333=9+1217|gid573=10@-75,0+953|gid3=11+420|gid815=12+546|gid283=13@-85,0+1105|gid3=14+420|gid659=15+914|gid283=16@-135,0+1055|gid3=17+420|gid283=18+1055|gid650=19@-135,0+999]
/System/Library/Fonts/SFNSDisplay.ttf@6e9677c443f6583228a63fd147663cfc635924d9:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid283=0@46,0+1147|gid659=1@-89,0+1006|gid3=2@46,0+512|gid4=3@46,0+1319|gid333=4@-19,0+1319|gid3=5@46,0+512|gid283=6@46,0+1167|gid815=7@-69,0+608|gid3=8@46,0+512|gid333=9@46,0+1309|gid573=10@-29,0+1045|gid3=11@46,0+512|gid815=12@46,0+638|gid283=13@-39,0+1197|gid3=14@46,0+512|gid659=15@46,0+1006|gid283=16@-89,0+1147|gid3=17@46,0+512|gid283=18@46,0+1147|gid650=19@-89,0+1091]
/System/Library/Fonts/Apple Color Emoji.ttc@60f77161021b1b87e99c3690e1a9b56341cf8792:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
/Library/Fonts/Zapfino.ttf@99a1e15163c3e9567d5b1019c45e9254dae63b08:--font-funcs ot:U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+006F:[Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|Z=6+416|a=7@-21,0+264|p_f=8+433|i=10+181|n=11+261|Z=12+416|a=13@-21,0+264|p_f=14+433|i=16+181|n=17+261|Z=18+416|a=19@-21,0+264|p_f=20+433|i=22+181|n=23+261|Z=24+416|a=25@-21,0+264|p_f=26+433|i=28+181|n=29+261|Z=30+416|a=31@-21,0+264|p_f=32+433|i=34+181|n=35+261|Z=36+416|a=37@-21,0+264|p_f=38+433|i=40+181|n=41+261|Z=42+416|a=43@-21,0+264|p_f=44+433|i=46+181|n=47+261|Z=48+416|a=49@-21,0+264|p_f=50+433|i=52+181|n=53+261|Z=54+416|a=55@-21,0+264|p_f=56+433|i=58+181|n=59+261|Z=60+416|a=61@-21,0+264|p_f=62+433|i=64+181|n=65+261|Z_a_p_f_i_n_o=66+2333]

View File

@ -432,7 +432,8 @@ shape_options_t::add_options (option_parser_t *parser)
" Features can be enabled or disabled, either globally or limited to\n" " Features can be enabled or disabled, either globally or limited to\n"
" specific character ranges. The format for specifying feature settings\n" " specific character ranges. The format for specifying feature settings\n"
" follows. All valid CSS font-feature-settings values other than 'normal'\n" " follows. All valid CSS font-feature-settings values other than 'normal'\n"
" and 'inherited' are also accepted, though, not documented below.\n" " and the global values are also accepted, though not documented below.\n"
" CSS string escapes are not supported."
"\n" "\n"
" The range indices refer to the positions between Unicode characters,\n" " The range indices refer to the positions between Unicode characters,\n"
" unless the --utf8-clusters is provided, in which case range indices\n" " unless the --utf8-clusters is provided, in which case range indices\n"