Merge branch 'master' into iter
This commit is contained in:
commit
a030ce4ff8
|
@ -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
|
|
@ -22,6 +22,16 @@ jobs:
|
|||
- run: make -j4
|
||||
- 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:
|
||||
docker:
|
||||
- image: ubuntu:17.10
|
||||
|
@ -239,8 +249,8 @@ jobs:
|
|||
- image: dockcross/base
|
||||
steps:
|
||||
- checkout
|
||||
- run: apt update && apt install ragel
|
||||
- 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: make -j32
|
||||
|
||||
|
@ -249,7 +259,6 @@ jobs:
|
|||
- image: dockcross/android-arm
|
||||
steps:
|
||||
- checkout
|
||||
- run: apt update && apt install ragel
|
||||
- run: cmake -Bbuild -H. -GNinja
|
||||
- run: ninja -Cbuild
|
||||
|
||||
|
@ -258,7 +267,6 @@ jobs:
|
|||
- image: dockcross/browser-asmjs
|
||||
steps:
|
||||
- checkout
|
||||
- run: apt update && apt install ragel
|
||||
- run: cmake -Bbuild -H. -GNinja
|
||||
- run: ninja -Cbuild
|
||||
|
||||
|
@ -267,7 +275,6 @@ jobs:
|
|||
- image: dockcross/linux-arm64
|
||||
steps:
|
||||
- checkout
|
||||
- run: apt update && apt install ragel
|
||||
- run: cmake -Bbuild -H. -GNinja
|
||||
- run: ninja -Cbuild
|
||||
|
||||
|
@ -276,7 +283,6 @@ jobs:
|
|||
- image: dockcross/linux-mips
|
||||
steps:
|
||||
- checkout
|
||||
- run: apt update && apt install ragel
|
||||
- run: cmake -Bbuild -H. -GNinja
|
||||
- run: ninja -Cbuild
|
||||
|
||||
|
@ -285,7 +291,6 @@ jobs:
|
|||
# - image: dockcross/windows-x64
|
||||
# steps:
|
||||
# - checkout
|
||||
# - run: apt update && apt install ragel
|
||||
# - run: cmake -Bbuild -H. -GNinja
|
||||
# - run: ninja -Cbuild
|
||||
|
||||
|
@ -296,6 +301,7 @@ workflows:
|
|||
# macOS
|
||||
- macos-10.12.6-aat-fonts
|
||||
- macos-10.13.6-aat-fonts
|
||||
- macos-10.14.3-aat-fonts
|
||||
|
||||
# both autotools and cmake
|
||||
- distcheck
|
||||
|
|
|
@ -8,11 +8,8 @@ insert_final_newline = true
|
|||
|
||||
[*.{c,cc,h,hh}]
|
||||
tab_width = 8
|
||||
indent_style = tab
|
||||
# This should be the following but as VSCode and Atom don't support it, disabled for now
|
||||
# https://github.com/Microsoft/vscode/issues/44438
|
||||
# indent_size = 2
|
||||
# indent_style = space
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
|
||||
[*.{py,sh}]
|
||||
indent_style = tab
|
||||
|
|
34
.travis.yml
34
.travis.yml
|
@ -16,9 +16,10 @@ matrix:
|
|||
- os: linux
|
||||
compiler: gcc
|
||||
script:
|
||||
# Remove these two lines when Travis updated 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 LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs"
|
||||
# Remove the following three lines when Travis updates its distro
|
||||
- export PKG_CONFIG_PATH="$HOME/.local/lib/pkgconfig"
|
||||
- export LD_LIBRARY_PATH="$HOME/.local/lib"
|
||||
- bash .ci/build-freetype.sh
|
||||
|
||||
- ./autogen.sh
|
||||
- ./configure $CONFIGURE_OPTS --enable-gtk-doc --enable-code-coverage
|
||||
|
@ -34,35 +35,24 @@ matrix:
|
|||
- os: linux
|
||||
compiler: clang
|
||||
script:
|
||||
# Remove these two lines when Travis updated 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 LD_LIBRARY_PATH="$PWD/freetype-2.9/objs/.libs"
|
||||
# Remove the following three lines when Travis updates its distro
|
||||
- export PKG_CONFIG_PATH="$HOME/.local/lib/pkgconfig"
|
||||
- export LD_LIBRARY_PATH="$HOME/.local/lib"
|
||||
- bash .ci/build-freetype.sh
|
||||
|
||||
- ./autogen.sh
|
||||
- ./configure $CONFIGURE_OPTS
|
||||
- make
|
||||
- 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:
|
||||
irc: "irc.freenode.org#harfbuzz"
|
||||
email: harfbuzz-bots-chatter@googlegroups.com
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- /home/travis/.local
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
|
|
|
@ -842,18 +842,6 @@ if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
|
|||
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)
|
||||
## src/ executables
|
||||
foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)
|
||||
|
|
|
@ -36,7 +36,7 @@ ChangeLog: $(srcdir)/ChangeLog
|
|||
$(srcdir)/ChangeLog:
|
||||
$(AM_V_GEN) if test -d "$(top_srcdir)/.git"; then \
|
||||
(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" \
|
||||
|| ($(RM) $@.tmp; \
|
||||
echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
|
||||
|
|
11
NEWS
11
NEWS
|
@ -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
|
||||
Wednesday, January 30, 2019
|
||||
====================================
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
AC_PREREQ([2.64])
|
||||
AC_INIT([HarfBuzz],
|
||||
[2.3.1],
|
||||
[2.4.0],
|
||||
[https://github.com/harfbuzz/harfbuzz/issues/new],
|
||||
[harfbuzz],
|
||||
[http://harfbuzz.org/])
|
||||
|
|
|
@ -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="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-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>
|
||||
|
|
|
@ -124,11 +124,17 @@ hb_script_get_horizontal_direction
|
|||
hb_language_from_string
|
||||
hb_language_to_string
|
||||
hb_language_get_default
|
||||
hb_feature_from_string
|
||||
hb_feature_to_string
|
||||
hb_variation_from_string
|
||||
hb_variation_to_string
|
||||
hb_bool_t
|
||||
hb_codepoint_t
|
||||
hb_destroy_func_t
|
||||
hb_direction_t
|
||||
hb_language_t
|
||||
hb_feature_t
|
||||
hb_variation_t
|
||||
hb_mask_t
|
||||
hb_position_t
|
||||
hb_tag_t
|
||||
|
@ -147,6 +153,8 @@ HB_DIRECTION_IS_HORIZONTAL
|
|||
HB_DIRECTION_IS_VALID
|
||||
HB_DIRECTION_IS_VERTICAL
|
||||
HB_LANGUAGE_INVALID
|
||||
HB_FEATURE_GLOBAL_END
|
||||
HB_FEATURE_GLOBAL_START
|
||||
<SUBSECTION Private>
|
||||
HB_BEGIN_DECLS
|
||||
HB_END_DECLS
|
||||
|
@ -321,9 +329,6 @@ hb_font_set_ppem
|
|||
hb_font_set_ptem
|
||||
hb_font_set_scale
|
||||
hb_font_set_user_data
|
||||
hb_variation_t
|
||||
hb_variation_from_string
|
||||
hb_variation_to_string
|
||||
hb_font_set_variations
|
||||
hb_font_set_var_coords_design
|
||||
hb_font_set_var_coords_normalized
|
||||
|
@ -649,11 +654,6 @@ hb_set_union
|
|||
|
||||
<SECTION>
|
||||
<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_full
|
||||
hb_shape_list_shapers
|
||||
|
|
|
@ -26,7 +26,7 @@ for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do
|
|||
symprefix=
|
||||
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/[.].*//'`
|
||||
|
||||
|
|
|
@ -79,10 +79,6 @@ data = combined
|
|||
del combined
|
||||
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
|
||||
singles = {}
|
||||
for u in ALLOWED_SINGLES:
|
||||
|
|
|
@ -48,7 +48,6 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block')
|
|||
# TODO Characters that are not in Unicode Indic files, but used in USE
|
||||
data[0][0x034F] = defaults[0]
|
||||
data[0][0x2060] = defaults[0]
|
||||
data[0][0x20F0] = defaults[0]
|
||||
# TODO https://github.com/roozbehp/unicode-data/issues/9
|
||||
data[0][0x11C44] = 'Consonant_Placeholder'
|
||||
data[0][0x11C45] = 'Consonant_Placeholder'
|
||||
|
@ -317,12 +316,11 @@ def map_to_use(data):
|
|||
|
||||
# Resolve Indic_Syllabic_Category
|
||||
|
||||
# TODO: These don't have UISC assigned in Unicode 8.0, but have UIPC
|
||||
if U == 0x17DD: UISC = Vowel_Dependent
|
||||
# TODO: These don't have UISC assigned in Unicode 12.0, but have UIPC
|
||||
if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark
|
||||
|
||||
# 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 0x0F86 <= U <= 0x0F87: UISC = Tone_Mark
|
||||
# Overrides to allow NFC order matching syllable
|
||||
|
@ -347,13 +345,7 @@ def map_to_use(data):
|
|||
if U == 0x1CED: UISC = Tone_Mark
|
||||
|
||||
# TODO: https://github.com/harfbuzz/harfbuzz/issues/525
|
||||
if U == 0x1A7F: UISC = Consonant_Final; UIPC = Bottom
|
||||
|
||||
# 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
|
||||
if U == 0x1A7F: UISC = Consonant_Final
|
||||
|
||||
# TODO: https://github.com/harfbuzz/harfbuzz/issues/1105
|
||||
if U == 0x11134: UISC = Gemination_Mark
|
||||
|
@ -367,27 +359,19 @@ def map_to_use(data):
|
|||
|
||||
# Resolve Indic_Positional_Category
|
||||
|
||||
# TODO: Not in Unicode 8.0 yet, but in spec.
|
||||
if U == 0x1B6C: UIPC = Bottom
|
||||
|
||||
# TODO: These should die, but have UIPC in Unicode 8.0
|
||||
# TODO: These should die, but have UIPC in Unicode 12.0
|
||||
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
|
||||
|
||||
# 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 U == 0x111CA: UIPC = Bottom
|
||||
if U == 0x11300: UIPC = Top
|
||||
# TODO: https://github.com/harfbuzz/harfbuzz/pull/1037
|
||||
if U == 0x11302: UIPC = Top
|
||||
if U == 0x1133C: UIPC = Bottom
|
||||
if U == 0x1171E: UIPC = Left # Correct?!
|
||||
if 0x1CF2 <= U <= 0x1CF3: UIPC = Right
|
||||
# and https://github.com/harfbuzz/harfbuzz/issues/1631
|
||||
if U in [0x11302, 0x11303, 0x114C1]: UIPC = Top
|
||||
if U == 0x1171E: UIPC = Left
|
||||
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
|
||||
USE in use_positions), "%s %s %s %s %s" % (hex(U), UIPC, USE, UISC, UGC)
|
||||
|
|
|
@ -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_font_t *font HB_UNUSED)')
|
||||
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 (' * vowel-sequences that look like another vowel. Data for each script')
|
||||
print (' * collected from the USE script development spec.')
|
||||
|
@ -212,6 +215,7 @@ print (' if (processed)')
|
|||
print (' {')
|
||||
print (' if (buffer->idx < count)')
|
||||
print (' buffer->next_glyph ();')
|
||||
print (' buffer->swap_buffers ();')
|
||||
print (' }')
|
||||
print ('}')
|
||||
|
||||
|
|
|
@ -76,6 +76,7 @@ struct ankr
|
|||
TRACE_SANITIZE (this);
|
||||
return_trace (likely (c->check_struct (this) &&
|
||||
version == 0 &&
|
||||
c->check_range (this, anchorData) &&
|
||||
lookupTable.sanitize (c, this, &(this+anchorData))));
|
||||
}
|
||||
|
||||
|
|
|
@ -418,15 +418,11 @@ struct Lookup
|
|||
} /* Close namespace. */
|
||||
/* Ugly hand-coded null objects for template Lookup<> :(. */
|
||||
extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2];
|
||||
template <>
|
||||
/*static*/ inline const AAT::Lookup<OT::HBUINT16>& Null<AAT::Lookup<OT::HBUINT16> > ()
|
||||
{ return *reinterpret_cast<const AAT::Lookup<OT::HBUINT16> *> (_hb_Null_AAT_Lookup); }
|
||||
template <>
|
||||
/*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); }
|
||||
template <typename T>
|
||||
struct Null<AAT::Lookup<T> > {
|
||||
static AAT::Lookup<T> const & get_null ()
|
||||
{ return *reinterpret_cast<const AAT::Lookup<T> *> (_hb_Null_AAT_Lookup); }
|
||||
};
|
||||
namespace AAT {
|
||||
|
||||
enum { DELETED_GLYPH = 0xFFFF };
|
||||
|
|
|
@ -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_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_get_relaxed(AI) (reinterpret_cast<std::atomic<int> *> (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_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> 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_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))
|
||||
static inline bool
|
||||
_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
|
||||
|
|
|
@ -284,6 +284,10 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
|
|||
* space glyph and zeroing the advance width.)
|
||||
* @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes
|
||||
* 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
|
||||
*/
|
||||
|
@ -292,7 +296,8 @@ typedef enum { /*< flags >*/
|
|||
HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */
|
||||
HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */
|
||||
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_EXTERN void
|
||||
|
|
|
@ -731,7 +731,7 @@ parse_uint (const char **pp, const char *end, unsigned int *pv)
|
|||
/* Intentionally use strtol instead of strtoul, such that
|
||||
* -1 turns into "big number"... */
|
||||
errno = 0;
|
||||
v = strtol (p, &pend, 0);
|
||||
v = strtol (p, &pend, 10);
|
||||
if (errno || p == pend)
|
||||
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
|
||||
* -1 turns into "big number"... */
|
||||
errno = 0;
|
||||
v = strtol (p, &pend, 0);
|
||||
v = strtol (p, &pend, 10);
|
||||
if (errno || p == pend)
|
||||
return false;
|
||||
|
||||
|
@ -857,9 +857,14 @@ parse_bool (const char **pp, const char *end, uint32_t *pv)
|
|||
(*pp)++;
|
||||
|
||||
/* 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;
|
||||
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;
|
||||
else
|
||||
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.
|
||||
*
|
||||
* 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:
|
||||
* %true if @str is successfully parsed, %false otherwise.
|
||||
|
|
|
@ -357,6 +357,14 @@ typedef enum
|
|||
/*11.0*/HB_SCRIPT_OLD_SOGDIAN = HB_TAG ('S','o','g','o'),
|
||||
/*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. */
|
||||
HB_SCRIPT_INVALID = HB_TAG_NONE,
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2015-2018 Ebrahim Byagowi
|
||||
* Copyright © 2015-2019 Ebrahim Byagowi
|
||||
*
|
||||
* This is part of HarfBuzz, a text shaping library.
|
||||
*
|
||||
|
@ -658,10 +658,10 @@ retry_getglyphs:
|
|||
* alignment needed after the WORD array. sizeof (WORD) == 2. */
|
||||
unsigned int glyphs_size = (scratch_size * sizeof (int) - 2)
|
||||
/ (sizeof (WORD) +
|
||||
sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) +
|
||||
sizeof (int) +
|
||||
sizeof (DWRITE_GLYPH_OFFSET) +
|
||||
sizeof (uint32_t));
|
||||
sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) +
|
||||
sizeof (int) +
|
||||
sizeof (DWRITE_GLYPH_OFFSET) +
|
||||
sizeof (uint32_t));
|
||||
ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
|
||||
|
||||
#undef ALLOCATE_ARRAY
|
||||
|
@ -868,3 +868,63 @@ hb_directwrite_shape_experimental_width (hb_font_t *font,
|
|||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright © 2015 Ebrahim Byagowi
|
||||
* Copyright © 2015-2019 Ebrahim Byagowi
|
||||
*
|
||||
* 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,
|
||||
unsigned int num_features, float width);
|
||||
|
||||
HB_EXTERN hb_face_t *
|
||||
hb_directwrite_face_create (IDWriteFontFace *font_face);
|
||||
|
||||
HB_END_DECLS
|
||||
|
||||
#endif /* HB_DIRECTWRITE_H */
|
||||
|
|
|
@ -225,7 +225,7 @@ struct hb_graphite2_cluster_t {
|
|||
unsigned int base_glyph;
|
||||
unsigned int num_glyphs;
|
||||
unsigned int cluster;
|
||||
float advance;
|
||||
unsigned int advance;
|
||||
};
|
||||
|
||||
hb_bool_t
|
||||
|
@ -253,7 +253,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
|
|||
gr_segment *seg = nullptr;
|
||||
const gr_slot *is;
|
||||
unsigned int ci = 0, ic = 0;
|
||||
float curradvx = 0., curradvy = 0.;
|
||||
unsigned int curradvx = 0, curradvy = 0;
|
||||
|
||||
unsigned int 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;
|
||||
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))
|
||||
{
|
||||
curradv = gr_slot_origin_X(gr_seg_first_slot(seg));
|
||||
clusters[0].advance = gr_seg_advance_X(seg) - curradv;
|
||||
curradv = gr_slot_origin_X(gr_seg_first_slot(seg)) * xscale;
|
||||
clusters[0].advance = gr_seg_advance_X(seg) * xscale - curradv;
|
||||
}
|
||||
else
|
||||
clusters[0].advance = 0;
|
||||
|
@ -355,14 +359,17 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
|
|||
c->base_glyph = ic;
|
||||
c->num_glyphs = 0;
|
||||
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
|
||||
{
|
||||
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++;
|
||||
curradv = gr_slot_origin_X(is);
|
||||
}
|
||||
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))
|
||||
clusters[ci].advance += curradv;
|
||||
else
|
||||
clusters[ci].advance += gr_seg_advance_X(seg) - curradv;
|
||||
clusters[ci].advance += gr_seg_advance_X(seg) * xscale - curradv;
|
||||
ci++;
|
||||
|
||||
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;
|
||||
|
||||
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. */
|
||||
unsigned int currclus = (unsigned int) -1;
|
||||
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->y_offset = gr_slot_origin_Y (is) * yscale - curradvy;
|
||||
if (info->cluster != currclus) {
|
||||
pPos->x_advance = info->var1.i32 * xscale;
|
||||
pPos->x_advance = info->var1.i32;
|
||||
curradvx += pPos->x_advance;
|
||||
currclus = info->cluster;
|
||||
} else
|
||||
|
@ -421,7 +424,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
|
|||
{
|
||||
if (info->cluster != currclus)
|
||||
{
|
||||
pPos->x_advance = info->var1.i32 * xscale;
|
||||
pPos->x_advance = info->var1.i32;
|
||||
curradvx -= pPos->x_advance;
|
||||
currclus = info->cluster;
|
||||
} 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;
|
||||
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;
|
||||
}
|
||||
hb_buffer_reverse_clusters (buffer);
|
||||
|
|
|
@ -326,27 +326,29 @@ struct hb_sanitize_context_t :
|
|||
}
|
||||
|
||||
bool check_range (const void *base,
|
||||
unsigned int len) const
|
||||
unsigned int len) const
|
||||
{
|
||||
const char *p = (const char *) base;
|
||||
bool ok = this->start <= p &&
|
||||
p <= this->end &&
|
||||
(unsigned int) (this->end - p) >= len &&
|
||||
this->max_ops-- > 0;
|
||||
bool ok = !len ||
|
||||
(this->start <= p &&
|
||||
p <= this->end &&
|
||||
(unsigned int) (this->end - p) >= len &&
|
||||
this->max_ops-- > 0);
|
||||
|
||||
DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
|
||||
"check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
|
||||
p, p + len, len,
|
||||
this->start, this->end,
|
||||
ok ? "OK" : "OUT-OF-RANGE");
|
||||
"check_range [%p..%p]"
|
||||
" (%d bytes) in [%p..%p] -> %s",
|
||||
p, p + len, len,
|
||||
this->start, this->end,
|
||||
ok ? "OK" : "OUT-OF-RANGE");
|
||||
|
||||
return likely (ok);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool check_range (const T *base,
|
||||
unsigned int a,
|
||||
unsigned int b) const
|
||||
unsigned int a,
|
||||
unsigned int b) const
|
||||
{
|
||||
return !hb_unsigned_mul_overflows (a, b) &&
|
||||
this->check_range (base, a * b);
|
||||
|
@ -354,9 +356,9 @@ struct hb_sanitize_context_t :
|
|||
|
||||
template <typename T>
|
||||
bool check_range (const T *base,
|
||||
unsigned int a,
|
||||
unsigned int b,
|
||||
unsigned int c) const
|
||||
unsigned int a,
|
||||
unsigned int b,
|
||||
unsigned int c) const
|
||||
{
|
||||
return !hb_unsigned_mul_overflows (a, b) &&
|
||||
this->check_range (base, a * b, c);
|
||||
|
|
|
@ -172,7 +172,7 @@ struct hb_map_t
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -104,15 +104,18 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_
|
|||
|
||||
/* Generic nul-content Null objects. */
|
||||
template <typename Type>
|
||||
static inline Type const & Null () {
|
||||
static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
|
||||
return *reinterpret_cast<Type const *> (_hb_NullPool);
|
||||
}
|
||||
struct Null {
|
||||
static Type const & get_null ()
|
||||
{
|
||||
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>
|
||||
struct NullHelper
|
||||
{
|
||||
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 ()
|
||||
|
||||
|
@ -121,9 +124,11 @@ struct NullHelper
|
|||
} /* Close namespace. */ \
|
||||
extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \
|
||||
template <> \
|
||||
/*static*/ inline const Namespace::Type& Null<Namespace::Type> () { \
|
||||
return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
|
||||
} \
|
||||
struct Null<Namespace::Type> { \
|
||||
static Namespace::Type const & get_null () { \
|
||||
return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
|
||||
} \
|
||||
}; \
|
||||
namespace Namespace { \
|
||||
static_assert (true, "Just so we take semicolon after.")
|
||||
#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
|
||||
|
@ -133,10 +138,12 @@ struct NullHelper
|
|||
#define DECLARE_NULL_INSTANCE(Type) \
|
||||
extern HB_INTERNAL const Type _hb_Null_##Type; \
|
||||
template <> \
|
||||
/*static*/ inline const Type& Null<Type> () { \
|
||||
return _hb_Null_##Type; \
|
||||
} \
|
||||
static_assert (true, "Just so we take semicolon after.")
|
||||
struct Null<Type> { \
|
||||
static Type const & get_null () { \
|
||||
return _hb_Null_##Type; \
|
||||
} \
|
||||
}; \
|
||||
static_assert (true, "Just so we take semicolon after.")
|
||||
#define DEFINE_NULL_INSTANCE(Type) \
|
||||
const Type _hb_Null_##Type
|
||||
|
||||
|
|
|
@ -525,6 +525,7 @@ struct FDArray : CFFIndexOf<COUNT, FontDict>
|
|||
for (unsigned i = 0; i < fontDicts.length; i++)
|
||||
if (fdmap.includes (i))
|
||||
{
|
||||
if (unlikely (fid >= fdCount)) return_trace (false);
|
||||
CFFIndexOf<COUNT, FontDict>::set_offset_at (fid++, offset);
|
||||
offset += FontDict::calculate_serialized_size (fontDicts[i], opszr);
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
* @short_description: OpenType font implementation
|
||||
* @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
|
||||
* never need to call these functions directly.
|
||||
**/
|
||||
|
|
|
@ -957,19 +957,6 @@ hb_ot_layout_lookup_would_substitute (hb_face_t *face,
|
|||
const hb_codepoint_t *glyphs,
|
||||
unsigned int glyphs_length,
|
||||
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;
|
||||
OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
|
||||
|
|
|
@ -96,13 +96,6 @@ HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
|
|||
* 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. */
|
||||
HB_INTERNAL void
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
*
|
||||
* on files with these headers:
|
||||
*
|
||||
* # ArabicShaping-11.0.0.txt
|
||||
* # Date: 2018-02-21, 14:50:00 GMT [KW, RP]
|
||||
* # Blocks-11.0.0.txt
|
||||
* # Date: 2017-10-16, 24:39:00 GMT [KW]
|
||||
* # ArabicShaping-12.0.0.txt
|
||||
* # Date: 2018-09-22, 23:54:00 GMT [KW, RP]
|
||||
* # Blocks-12.0.0.txt
|
||||
* # Date: 2018-07-30, 19:40:00 GMT [KW]
|
||||
* 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,
|
||||
/* 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
|
||||
|
@ -190,7 +190,7 @@ joining_type (hb_codepoint_t u)
|
|||
break;
|
||||
|
||||
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;
|
||||
|
||||
default:
|
||||
|
|
|
@ -214,7 +214,8 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
|||
else
|
||||
{
|
||||
/* 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];
|
||||
if (!is_zero_width_char (font, u)) {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -52,6 +52,7 @@ DOTTEDCIRCLE = 12;
|
|||
RS = 13;
|
||||
Repha = 15;
|
||||
Ra = 16;
|
||||
CM = 17;
|
||||
Symbol= 18;
|
||||
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}?;
|
||||
halant_group = (z?.H.(ZWJ.N?)?);
|
||||
final_halant_group = halant_group | H.ZWNJ;
|
||||
medial_group = CM?;
|
||||
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;
|
||||
vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail);
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
*
|
||||
* on files with these headers:
|
||||
*
|
||||
* # IndicSyllabicCategory-11.0.0.txt
|
||||
* # Date: 2018-05-21, 18:33:00 GMT [KW, RP]
|
||||
* # IndicPositionalCategory-11.0.0.txt
|
||||
* # Date: 2018-02-05, 16:21:00 GMT [KW, RP]
|
||||
* # Blocks-11.0.0.txt
|
||||
* # Date: 2017-10-16, 24:39:00 GMT [KW]
|
||||
* # IndicSyllabicCategory-12.0.0.txt
|
||||
* # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
|
||||
* # IndicPositionalCategory-12.0.0.txt
|
||||
* # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
|
||||
* # Blocks-12.0.0.txt
|
||||
* # Date: 2018-07-30, 19:40:00 GMT [KW]
|
||||
*/
|
||||
|
||||
#include "hb-ot-shape-complex-indic.hh"
|
||||
|
@ -19,21 +19,21 @@
|
|||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-macros"
|
||||
|
||||
#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 16 chars; Avagraha */
|
||||
#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 83 chars; Bindu */
|
||||
#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 17 chars; Avagraha */
|
||||
#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_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 58 chars; Cantillation_Mark */
|
||||
#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2110 chars; Consonant */
|
||||
#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */
|
||||
#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 59 chars; Cantillation_Mark */
|
||||
#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2160 chars; Consonant */
|
||||
#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_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_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
|
||||
#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 28 chars; Consonant_Medial */
|
||||
#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 21 chars; Consonant_Placeholder */
|
||||
#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 29 chars; Consonant_Medial */
|
||||
#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_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 7 chars; Consonant_Prefixed */
|
||||
#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 95 chars; Consonant_Subjoined */
|
||||
#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 9 chars; Consonant_Prefixed */
|
||||
#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_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 6 chars; Consonant_With_Stacker */
|
||||
#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_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
|
||||
#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_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
|
||||
#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_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
|
||||
#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
|
||||
#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 25 chars; Virama */
|
||||
#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 36 chars; Visarga */
|
||||
#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 27 chars; Virama */
|
||||
#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 35 chars; Visarga */
|
||||
#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
|
||||
#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 660 chars; Vowel_Dependent */
|
||||
#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 464 chars; Vowel_Independent */
|
||||
#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 673 chars; Vowel_Dependent */
|
||||
#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_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_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
|
||||
#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
|
||||
#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 276 chars; Right */
|
||||
#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 393 chars; Top */
|
||||
#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 281 chars; Right */
|
||||
#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_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 */
|
||||
|
@ -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),
|
||||
/* 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),
|
||||
/* 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),
|
||||
/* 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),
|
||||
|
@ -237,7 +237,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
|
|||
|
||||
/* 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),
|
||||
/* 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),
|
||||
|
@ -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),
|
||||
/* 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),
|
||||
/* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,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),
|
||||
/* 1CF0 */ _(x,x), _(x,x), _(CD,x), _(CD,x), _(Ca,T),_(CWS,x),_(CWS,x), _(Ca,R),
|
||||
/* 1CF8 */ _(Ca,x), _(Ca,x), _(CP,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
|
||||
|
||||
#define indic_offset_0x2008u 1656
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ struct would_substitute_feature_t
|
|||
hb_face_t *face) const
|
||||
{
|
||||
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 false;
|
||||
}
|
||||
|
@ -720,7 +720,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
|
|||
indic_position_t last_pos = POS_START;
|
||||
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;
|
||||
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_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.
|
||||
* TODO Use a buffer scratch flag to remove the loop. */
|
||||
bool has_broken_syllables = false;
|
||||
|
@ -1199,9 +1202,14 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
|
|||
goto search;
|
||||
}
|
||||
}
|
||||
/* -> If ZWNJ follows this halant, position is moved after it. */
|
||||
if (info[new_pos + 1].indic_category() == OT_ZWNJ)
|
||||
new_pos++;
|
||||
/* -> If ZWNJ follows this halant, position is moved after it.
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -62,17 +62,19 @@ enum indic_category_t {
|
|||
OT_Coeng = 14, /* Khmer-style Virama. */
|
||||
OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
|
||||
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_CS = 19
|
||||
};
|
||||
|
||||
#define MEDIAL_FLAGS (FLAG (OT_CM))
|
||||
|
||||
/* Note:
|
||||
*
|
||||
* 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
|
||||
* 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))
|
||||
|
||||
|
||||
|
@ -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 == 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 (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
|
||||
cat = OT_PLACEHOLDER;
|
||||
|
|
|
@ -35,29 +35,27 @@
|
|||
#line 36 "hb-ot-shape-complex-khmer-machine.hh"
|
||||
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, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u,
|
||||
5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 16u, 1u, 29u, 5u, 29u,
|
||||
5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 5u, 26u,
|
||||
5u, 29u, 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u,
|
||||
5u, 29u, 0
|
||||
5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u,
|
||||
5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u,
|
||||
22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u,
|
||||
5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u,
|
||||
0
|
||||
};
|
||||
|
||||
static const char _khmer_syllable_machine_key_spans[] = {
|
||||
22, 17, 22, 17, 16, 17, 22, 17,
|
||||
22, 17, 16, 17, 22, 17, 16, 17,
|
||||
22, 17, 22, 17, 22, 16, 29, 25,
|
||||
25, 25, 1, 18, 25, 25, 25, 22,
|
||||
25, 25, 1, 18, 25, 25, 16, 25,
|
||||
25
|
||||
22, 17, 17, 22, 17, 16, 17, 22,
|
||||
17, 22, 17, 22, 29, 25, 25, 25,
|
||||
1, 18, 25, 25, 25, 16, 22, 25,
|
||||
25, 1, 18, 25, 25, 16, 25, 25
|
||||
};
|
||||
|
||||
static const short _khmer_syllable_machine_index_offsets[] = {
|
||||
0, 23, 41, 64, 82, 99, 117, 140,
|
||||
158, 181, 199, 216, 234, 257, 275, 292,
|
||||
310, 333, 351, 374, 392, 415, 432, 462,
|
||||
488, 514, 540, 542, 561, 587, 613, 639,
|
||||
662, 688, 714, 716, 735, 761, 787, 804,
|
||||
830
|
||||
158, 181, 199, 217, 240, 258, 275, 293,
|
||||
316, 334, 357, 375, 398, 428, 454, 480,
|
||||
506, 508, 527, 553, 579, 605, 622, 645,
|
||||
671, 697, 699, 718, 744, 770, 787, 813
|
||||
};
|
||||
|
||||
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, 4, 0, 11, 11, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 12, 0, 13,
|
||||
13, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 13, 0,
|
||||
15, 15, 14, 14, 14, 14, 14, 14,
|
||||
14, 14, 14, 14, 14, 14, 14, 14,
|
||||
16, 14, 15, 15, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 16, 17, 17, 17, 17, 18,
|
||||
17, 19, 19, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 18, 17, 20, 20, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 20, 17, 21, 21, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 22, 17, 23, 23,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 24, 17,
|
||||
17, 17, 17, 18, 17, 23, 23, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 24, 17, 25,
|
||||
25, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 26,
|
||||
17, 17, 17, 17, 18, 17, 25, 25,
|
||||
17, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 26, 17,
|
||||
15, 15, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 17, 27,
|
||||
16, 17, 17, 17, 17, 18, 17, 28,
|
||||
28, 17, 17, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 17, 17, 28, 17,
|
||||
13, 13, 29, 29, 30, 30, 29, 29,
|
||||
29, 29, 2, 2, 29, 31, 29, 13,
|
||||
29, 29, 29, 29, 16, 20, 29, 29,
|
||||
29, 18, 24, 26, 22, 29, 33, 33,
|
||||
32, 32, 32, 32, 32, 32, 32, 34,
|
||||
32, 32, 32, 32, 32, 2, 3, 6,
|
||||
32, 32, 32, 4, 10, 12, 8, 32,
|
||||
35, 35, 32, 32, 32, 32, 32, 32,
|
||||
32, 36, 32, 32, 32, 32, 32, 32,
|
||||
3, 6, 32, 32, 32, 4, 10, 12,
|
||||
8, 32, 5, 5, 32, 32, 32, 32,
|
||||
32, 32, 32, 36, 32, 32, 32, 32,
|
||||
32, 32, 4, 6, 32, 32, 32, 32,
|
||||
32, 32, 8, 32, 6, 32, 7, 7,
|
||||
32, 32, 32, 32, 32, 32, 32, 36,
|
||||
32, 32, 32, 32, 32, 32, 8, 6,
|
||||
32, 37, 37, 32, 32, 32, 32, 32,
|
||||
32, 32, 36, 32, 32, 32, 32, 32,
|
||||
32, 10, 6, 32, 32, 32, 4, 32,
|
||||
32, 8, 32, 38, 38, 32, 32, 32,
|
||||
32, 32, 32, 32, 36, 32, 32, 32,
|
||||
32, 32, 32, 12, 6, 32, 32, 32,
|
||||
4, 10, 32, 8, 32, 35, 35, 32,
|
||||
32, 32, 32, 32, 32, 32, 34, 32,
|
||||
32, 32, 32, 32, 32, 3, 6, 32,
|
||||
32, 32, 4, 10, 12, 8, 32, 15,
|
||||
15, 39, 39, 39, 39, 39, 39, 39,
|
||||
39, 39, 39, 39, 39, 39, 39, 16,
|
||||
39, 39, 39, 39, 18, 39, 41, 41,
|
||||
40, 40, 40, 40, 40, 40, 40, 42,
|
||||
40, 40, 40, 40, 40, 40, 16, 20,
|
||||
40, 40, 40, 18, 24, 26, 22, 40,
|
||||
19, 19, 40, 40, 40, 40, 40, 40,
|
||||
40, 42, 40, 40, 40, 40, 40, 40,
|
||||
18, 20, 40, 40, 40, 40, 40, 40,
|
||||
22, 40, 20, 40, 21, 21, 40, 40,
|
||||
40, 40, 40, 40, 40, 42, 40, 40,
|
||||
40, 40, 40, 40, 22, 20, 40, 43,
|
||||
43, 40, 40, 40, 40, 40, 40, 40,
|
||||
42, 40, 40, 40, 40, 40, 40, 24,
|
||||
20, 40, 40, 40, 18, 40, 40, 22,
|
||||
40, 44, 44, 40, 40, 40, 40, 40,
|
||||
40, 40, 42, 40, 40, 40, 40, 40,
|
||||
40, 26, 20, 40, 40, 40, 18, 24,
|
||||
40, 22, 40, 28, 28, 39, 39, 39,
|
||||
0, 0, 0, 0, 0, 12, 0, 14,
|
||||
14, 13, 13, 13, 13, 13, 13, 13,
|
||||
13, 13, 13, 13, 13, 13, 13, 15,
|
||||
13, 14, 14, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 15, 16, 16, 16, 16, 17, 16,
|
||||
18, 18, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
17, 16, 19, 19, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 19, 16, 20, 20, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 21, 16, 22, 22, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 23, 16, 16,
|
||||
16, 16, 17, 16, 22, 22, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 23, 16, 24, 24,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 25, 16,
|
||||
16, 16, 16, 17, 16, 24, 24, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 25, 16, 14,
|
||||
14, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 26, 15,
|
||||
16, 16, 16, 16, 17, 16, 28, 28,
|
||||
27, 27, 29, 29, 27, 27, 27, 27,
|
||||
2, 2, 27, 30, 27, 28, 27, 27,
|
||||
27, 27, 15, 19, 27, 27, 27, 17,
|
||||
23, 25, 21, 27, 32, 32, 31, 31,
|
||||
31, 31, 31, 31, 31, 33, 31, 31,
|
||||
31, 31, 31, 2, 3, 6, 31, 31,
|
||||
31, 4, 10, 12, 8, 31, 34, 34,
|
||||
31, 31, 31, 31, 31, 31, 31, 35,
|
||||
31, 31, 31, 31, 31, 31, 3, 6,
|
||||
31, 31, 31, 4, 10, 12, 8, 31,
|
||||
5, 5, 31, 31, 31, 31, 31, 31,
|
||||
31, 35, 31, 31, 31, 31, 31, 31,
|
||||
4, 6, 31, 31, 31, 31, 31, 31,
|
||||
8, 31, 6, 31, 7, 7, 31, 31,
|
||||
31, 31, 31, 31, 31, 35, 31, 31,
|
||||
31, 31, 31, 31, 8, 6, 31, 36,
|
||||
36, 31, 31, 31, 31, 31, 31, 31,
|
||||
35, 31, 31, 31, 31, 31, 31, 10,
|
||||
6, 31, 31, 31, 4, 31, 31, 8,
|
||||
31, 37, 37, 31, 31, 31, 31, 31,
|
||||
31, 31, 35, 31, 31, 31, 31, 31,
|
||||
31, 12, 6, 31, 31, 31, 4, 10,
|
||||
31, 8, 31, 34, 34, 31, 31, 31,
|
||||
31, 31, 31, 31, 33, 31, 31, 31,
|
||||
31, 31, 31, 3, 6, 31, 31, 31,
|
||||
4, 10, 12, 8, 31, 28, 28, 31,
|
||||
31, 31, 31, 31, 31, 31, 31, 31,
|
||||
31, 31, 31, 31, 28, 31, 14, 14,
|
||||
38, 38, 38, 38, 38, 38, 38, 38,
|
||||
38, 38, 38, 38, 38, 38, 15, 38,
|
||||
38, 38, 38, 17, 38, 40, 40, 39,
|
||||
39, 39, 39, 39, 39, 39, 41, 39,
|
||||
39, 39, 39, 39, 39, 15, 19, 39,
|
||||
39, 39, 17, 23, 25, 21, 39, 18,
|
||||
18, 39, 39, 39, 39, 39, 39, 39,
|
||||
41, 39, 39, 39, 39, 39, 39, 17,
|
||||
19, 39, 39, 39, 39, 39, 39, 21,
|
||||
39, 19, 39, 20, 20, 39, 39, 39,
|
||||
39, 39, 39, 39, 41, 39, 39, 39,
|
||||
39, 39, 39, 21, 19, 39, 42, 42,
|
||||
39, 39, 39, 39, 39, 39, 39, 41,
|
||||
39, 39, 39, 39, 39, 39, 23, 19,
|
||||
39, 39, 39, 17, 39, 39, 21, 39,
|
||||
43, 43, 39, 39, 39, 39, 39, 39,
|
||||
39, 41, 39, 39, 39, 39, 39, 39,
|
||||
25, 19, 39, 39, 39, 17, 23, 39,
|
||||
21, 39, 44, 44, 39, 39, 39, 39,
|
||||
39, 39, 39, 39, 39, 39, 39, 39,
|
||||
39, 39, 28, 39, 45, 45, 40, 40,
|
||||
40, 40, 40, 40, 40, 46, 40, 40,
|
||||
40, 40, 40, 27, 16, 20, 40, 40,
|
||||
40, 18, 24, 26, 22, 40, 41, 41,
|
||||
40, 40, 40, 40, 40, 40, 40, 46,
|
||||
40, 40, 40, 40, 40, 40, 16, 20,
|
||||
40, 40, 40, 18, 24, 26, 22, 40,
|
||||
0
|
||||
39, 44, 39, 45, 45, 39, 39, 39,
|
||||
39, 39, 39, 39, 30, 39, 39, 39,
|
||||
39, 39, 26, 15, 19, 39, 39, 39,
|
||||
17, 23, 25, 21, 39, 40, 40, 39,
|
||||
39, 39, 39, 39, 39, 39, 30, 39,
|
||||
39, 39, 39, 39, 39, 15, 19, 39,
|
||||
39, 39, 17, 23, 25, 21, 39, 0
|
||||
};
|
||||
|
||||
static const char _khmer_syllable_machine_trans_targs[] = {
|
||||
22, 1, 30, 24, 25, 3, 26, 5,
|
||||
27, 7, 28, 9, 29, 23, 22, 11,
|
||||
32, 22, 33, 13, 34, 15, 35, 17,
|
||||
36, 19, 37, 40, 39, 22, 31, 38,
|
||||
22, 0, 10, 2, 4, 6, 8, 22,
|
||||
22, 12, 14, 16, 18, 20, 21
|
||||
20, 1, 28, 22, 23, 3, 24, 5,
|
||||
25, 7, 26, 9, 27, 20, 10, 31,
|
||||
20, 32, 12, 33, 14, 34, 16, 35,
|
||||
18, 36, 39, 20, 21, 30, 37, 20,
|
||||
0, 29, 2, 4, 6, 8, 20, 20,
|
||||
11, 13, 15, 17, 38, 19
|
||||
};
|
||||
|
||||
static const char _khmer_syllable_machine_trans_actions[] = {
|
||||
1, 0, 2, 2, 2, 0, 0, 0,
|
||||
2, 0, 2, 0, 2, 2, 3, 0,
|
||||
4, 5, 2, 0, 0, 0, 2, 0,
|
||||
2, 0, 2, 4, 4, 8, 9, 0,
|
||||
10, 0, 0, 0, 0, 0, 0, 11,
|
||||
12, 0, 0, 0, 0, 0, 0
|
||||
2, 0, 2, 0, 2, 3, 0, 4,
|
||||
5, 2, 0, 0, 0, 2, 0, 2,
|
||||
0, 2, 4, 8, 2, 9, 0, 10,
|
||||
0, 0, 0, 0, 0, 0, 11, 12,
|
||||
0, 0, 0, 0, 4, 0
|
||||
};
|
||||
|
||||
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, 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
|
||||
};
|
||||
|
||||
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, 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
|
||||
};
|
||||
|
||||
static const unsigned char _khmer_syllable_machine_eof_trans[] = {
|
||||
1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 15, 18, 18, 18, 18,
|
||||
18, 18, 18, 18, 18, 18, 0, 33,
|
||||
33, 33, 33, 33, 33, 33, 33, 40,
|
||||
41, 41, 41, 41, 41, 41, 40, 41,
|
||||
41
|
||||
1, 1, 14, 17, 17, 17, 17, 17,
|
||||
17, 17, 17, 17, 0, 32, 32, 32,
|
||||
32, 32, 32, 32, 32, 32, 39, 40,
|
||||
40, 40, 40, 40, 40, 40, 40, 40
|
||||
};
|
||||
|
||||
static const int khmer_syllable_machine_start = 22;
|
||||
static const int khmer_syllable_machine_first_final = 22;
|
||||
static const int khmer_syllable_machine_start = 20;
|
||||
static const int khmer_syllable_machine_first_final = 20;
|
||||
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"
|
||||
|
@ -246,7 +238,7 @@ find_syllables (hb_buffer_t *buffer)
|
|||
int cs;
|
||||
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;
|
||||
ts = 0;
|
||||
|
@ -262,7 +254,7 @@ find_syllables (hb_buffer_t *buffer)
|
|||
|
||||
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 _trans;
|
||||
|
@ -276,7 +268,7 @@ _resume:
|
|||
#line 1 "NONE"
|
||||
{ts = p;}
|
||||
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);
|
||||
|
@ -346,7 +338,7 @@ _eof_trans:
|
|||
#line 76 "hb-ot-shape-complex-khmer-machine.rl"
|
||||
{act = 3;}
|
||||
break;
|
||||
#line 350 "hb-ot-shape-complex-khmer-machine.hh"
|
||||
#line 342 "hb-ot-shape-complex-khmer-machine.hh"
|
||||
}
|
||||
|
||||
_again:
|
||||
|
@ -355,7 +347,7 @@ _again:
|
|||
#line 1 "NONE"
|
||||
{ts = 0;}
|
||||
break;
|
||||
#line 359 "hb-ot-shape-complex-khmer-machine.hh"
|
||||
#line 351 "hb-ot-shape-complex-khmer-machine.hh"
|
||||
}
|
||||
|
||||
if ( ++p != pe )
|
||||
|
|
|
@ -66,7 +66,7 @@ matra_group = VPre? xgroup VBlw? xgroup (joiner?.VAbv)? xgroup VPst?;
|
|||
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;
|
||||
other = any;
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ struct would_substitute_feature_t
|
|||
hb_face_t *face) const
|
||||
{
|
||||
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 false;
|
||||
}
|
||||
|
@ -365,6 +365,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
|||
hb_font_t *font,
|
||||
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. */
|
||||
bool has_broken_syllables = false;
|
||||
unsigned int count = buffer->len;
|
||||
|
|
|
@ -298,6 +298,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
|||
hb_font_t *font,
|
||||
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. */
|
||||
bool has_broken_syllables = false;
|
||||
unsigned int count = buffer->len;
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
*
|
||||
* on files with these headers:
|
||||
*
|
||||
* # IndicSyllabicCategory-11.0.0.txt
|
||||
* # Date: 2018-05-21, 18:33:00 GMT [KW, RP]
|
||||
* # IndicPositionalCategory-11.0.0.txt
|
||||
* # Date: 2018-02-05, 16:21:00 GMT [KW, RP]
|
||||
* # Blocks-11.0.0.txt
|
||||
* # Date: 2017-10-16, 24:39:00 GMT [KW]
|
||||
* # IndicSyllabicCategory-12.0.0.txt
|
||||
* # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
|
||||
* # IndicPositionalCategory-12.0.0.txt
|
||||
* # Date: 2019-01-31, 02:26:00 GMT [KW, RP]
|
||||
* # Blocks-12.0.0.txt
|
||||
* # Date: 2018-07-30, 19:40:00 GMT [KW]
|
||||
* UnicodeData.txt does not have a header.
|
||||
*/
|
||||
|
||||
|
@ -167,7 +167,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
|
|||
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
@ -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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
||||
#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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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
|
||||
|
||||
|
@ -393,7 +393,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
|
|||
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
@ -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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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 */
|
||||
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
@ -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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
||||
#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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
@ -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,
|
||||
/* 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 */
|
||||
|
||||
/* 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,
|
||||
/* 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,
|
||||
/* 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,
|
||||
|
||||
#define use_offset_0x11c00u 5392
|
||||
#define use_offset_0x11c00u 5488
|
||||
|
||||
|
||||
/* 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,
|
||||
/* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O,
|
||||
|
||||
#define use_offset_0x11d00u 5576
|
||||
#define use_offset_0x11d00u 5672
|
||||
|
||||
|
||||
/* 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,
|
||||
/* 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 */
|
||||
|
@ -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,
|
||||
/* 11EF0 */ B, B, GB, VAbv, VBlw, VPre, VPst, O,
|
||||
|
||||
}; /* Table items: 5776; occupancy: 74% */
|
||||
}; /* Table items: 5872; occupancy: 74% */
|
||||
|
||||
USE_TABLE_ELEMENT_TYPE
|
||||
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, 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, 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, 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];
|
||||
|
|
|
@ -523,6 +523,9 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
|||
hb_font_t *font,
|
||||
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. */
|
||||
bool has_broken_syllables = false;
|
||||
unsigned int count = buffer->len;
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
* # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
|
||||
* # On October 23, 2018; with documentd dated 02/07/2018.
|
||||
*
|
||||
* # Scripts-11.0.0.txt
|
||||
* # Date: 2018-02-21, 05:34:31 GMT
|
||||
* # Scripts-12.0.0.txt
|
||||
* # Date: 2019-01-28, 22:16:47 GMT
|
||||
*/
|
||||
|
||||
#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_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
|
||||
* vowel-sequences that look like another vowel. Data for each script
|
||||
* collected from the USE script development spec.
|
||||
|
|
|
@ -377,6 +377,9 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
|
|||
case HB_SCRIPT_MAKASAR:
|
||||
//case HB_SCRIPT_SOGDIAN:
|
||||
|
||||
/* Unicode-12.0 additions */
|
||||
case HB_SCRIPT_NANDINAGARI:
|
||||
|
||||
/* If the designer designed the font for the 'DFLT' script,
|
||||
* (or we ended up arbitrarily pick 'latn'), use the default shaper.
|
||||
* Otherwise, use the specific shaper.
|
||||
|
|
|
@ -448,6 +448,9 @@ hb_set_unicode_props (hb_buffer_t *buffer)
|
|||
static void
|
||||
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) ||
|
||||
buffer->context_len[0] ||
|
||||
!_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
*
|
||||
* on files with these headers:
|
||||
*
|
||||
* <meta name="updated_at" content="2018-09-07 07:45 PM" />
|
||||
* File-Date: 2018-08-08
|
||||
* <meta name="updated_at" content="2018-11-18 05:25 AM" />
|
||||
* File-Date: 2019-02-20
|
||||
*/
|
||||
|
||||
#ifndef HB_OT_TAG_TABLE_HH
|
||||
|
@ -131,7 +131,7 @@ static const LangTag ot_languages[] = {
|
|||
{"bjt", {HB_TAG('B','L','N',' ')}}, /* Balanta-Ganja -> Balante */
|
||||
{"bla", {HB_TAG('B','K','F',' ')}}, /* Siksika -> Blackfoot */
|
||||
{"ble", {HB_TAG('B','L','N',' ')}}, /* Balanta-Kentohe -> Balante */
|
||||
{"blk", {HB_TAG('B','L','K',' ')}}, /* Pa'o Karen */
|
||||
{"blk", {HB_TAG('B','L','K',' ')}}, /* Pa’o Karen */
|
||||
{"bln", {HB_TAG('B','I','K',' ')}}, /* Southern Catanduanes Bikol -> Bikol */
|
||||
{"bm", {HB_TAG('B','M','B',' ')}}, /* Bambara (Bamanankan) */
|
||||
{"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 */
|
||||
{"flm", {HB_TAG('H','A','L',' '), /* Halam (Falam Chin) (retired code) */
|
||||
HB_TAG('Q','I','N',' ')}}, /* Falam Chin (retired code) -> Chin */
|
||||
{"fmp", {HB_TAG('F','M','P',' ')}}, /* Fe'fe' */
|
||||
{"fmp", {HB_TAG('F','M','P',' ')}}, /* Fe’fe’ */
|
||||
{"fo", {HB_TAG('F','O','S',' ')}}, /* Faroese */
|
||||
{"fon", {HB_TAG('F','O','N',' ')}}, /* Fon */
|
||||
{"fr", {HB_TAG('F','R','A',' ')}}, /* French */
|
||||
|
@ -653,7 +653,7 @@ static const LangTag ot_languages[] = {
|
|||
{"mwr", {HB_TAG('M','A','W',' ')}}, /* Marwari [macrolanguage] */
|
||||
{"mww", {HB_TAG('M','W','W',' ')}}, /* Hmong Daw */
|
||||
{"my", {HB_TAG('B','R','M',' ')}}, /* Burmese */
|
||||
{"mym", {HB_TAG('M','E','N',' ')}}, /* Me'en */
|
||||
{"mym", {HB_TAG('M','E','N',' ')}}, /* Me’en */
|
||||
{"myn", {HB_TAG('M','Y','N',' ')}}, /* Mayan [family] */
|
||||
{"myq", {HB_TAG('M','N','K',' ')}}, /* Forest Maninka (retired code) -> Maninka */
|
||||
{"myv", {HB_TAG('E','R','Z',' ')}}, /* Erzya */
|
||||
|
@ -687,7 +687,7 @@ static const LangTag ot_languages[] = {
|
|||
{"nog", {HB_TAG('N','O','G',' ')}}, /* Nogai */
|
||||
{"nov", {HB_TAG('N','O','V',' ')}}, /* Novial */
|
||||
{"npi", {HB_TAG('N','E','P',' ')}}, /* Nepali */
|
||||
{"nqo", {HB_TAG('N','K','O',' ')}}, /* N'Ko */
|
||||
{"nqo", {HB_TAG('N','K','O',' ')}}, /* N’Ko */
|
||||
{"nr", {HB_TAG('N','D','B',' ')}}, /* South Ndebele -> Ndebele */
|
||||
{"nsk", {HB_TAG('N','A','S',' ')}}, /* Naskapi */
|
||||
{"nso", {HB_TAG('N','S','O',' ')}}, /* Pedi -> Sotho, Northern */
|
||||
|
|
|
@ -171,24 +171,6 @@ hb_ot_tag_to_script (hb_tag_t tag)
|
|||
|
||||
/* 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
|
||||
subtag_matches (const char *lang_str,
|
||||
const char *limit,
|
||||
|
@ -213,10 +195,28 @@ lang_matches (const char *lang_str, const char *spec)
|
|||
(lang_str[len] == '\0' || lang_str[len] == '-');
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
struct LangTag
|
||||
{
|
||||
char language[4];
|
||||
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"
|
||||
|
||||
|
@ -263,9 +263,7 @@ hb_ot_tags_from_language (const char *lang_str,
|
|||
ISALPHA (s[1]))
|
||||
lang_str = s + 1;
|
||||
}
|
||||
lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
|
||||
ARRAY_LENGTH (ot_languages), sizeof (LangTag),
|
||||
lang_compare_first_component);
|
||||
lang_tag = hb_sorted_array (ot_languages).bsearch (lang_str);
|
||||
if (lang_tag)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -507,7 +505,7 @@ test_langs_sorted ()
|
|||
{
|
||||
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)
|
||||
{
|
||||
fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
|
||||
|
|
|
@ -96,10 +96,10 @@ _remove_invalid_gids (hb_set_t *glyphs,
|
|||
static hb_set_t *
|
||||
_populate_gids_to_retain (hb_face_t *face,
|
||||
const hb_set_t *unicodes,
|
||||
const hb_set_t *input_glyphs_to_retain,
|
||||
bool close_over_gsub,
|
||||
hb_set_t *unicodes_to_retain,
|
||||
hb_map_t *codepoint_to_glyph,
|
||||
hb_vector_t<hb_codepoint_t> *glyphs)
|
||||
hb_map_t *codepoint_to_glyph)
|
||||
{
|
||||
OT::cmap::accelerator_t cmap;
|
||||
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 ();
|
||||
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;
|
||||
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 ());
|
||||
|
||||
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 ();
|
||||
glyf.fini ();
|
||||
|
@ -158,26 +155,29 @@ _populate_gids_to_retain (hb_face_t *face,
|
|||
static void
|
||||
_create_old_gid_to_new_gid_map (const hb_face_t *face,
|
||||
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 *reverse_glyph_map, /* 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)
|
||||
{
|
||||
glyph_map->set (glyphs[i], i);
|
||||
reverse_glyph_map->set (i, glyphs[i]);
|
||||
glyph_map->set (gid, i);
|
||||
reverse_glyph_map->set (i, gid);
|
||||
}
|
||||
else
|
||||
{
|
||||
glyph_map->set (glyphs[i], glyphs[i]);
|
||||
reverse_glyph_map->set (glyphs[i], glyphs[i]);
|
||||
glyph_map->set (gid, gid);
|
||||
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
|
||||
{
|
||||
|
@ -205,7 +205,6 @@ hb_subset_plan_create (hb_face_t *face,
|
|||
plan->drop_layout = input->drop_layout;
|
||||
plan->desubroutinize = input->desubroutinize;
|
||||
plan->unicodes = hb_set_create();
|
||||
plan->glyphs_deprecated.init();
|
||||
plan->source = hb_face_reference (face);
|
||||
plan->dest = hb_face_builder_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->_glyphset = _populate_gids_to_retain (face,
|
||||
input->unicodes,
|
||||
input->glyphs,
|
||||
!plan->drop_layout,
|
||||
plan->unicodes,
|
||||
plan->codepoint_to_glyph,
|
||||
&plan->glyphs_deprecated);
|
||||
plan->codepoint_to_glyph);
|
||||
|
||||
_create_old_gid_to_new_gid_map (face,
|
||||
input->retain_gids,
|
||||
plan->glyphs_deprecated,
|
||||
plan->_glyphset,
|
||||
plan->glyph_map,
|
||||
plan->reverse_glyph_map,
|
||||
&plan->_num_output_glyphs);
|
||||
|
@ -239,7 +238,6 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan)
|
|||
if (!hb_object_destroy (plan)) return;
|
||||
|
||||
hb_set_destroy (plan->unicodes);
|
||||
plan->glyphs_deprecated.fini ();
|
||||
hb_face_destroy (plan->source);
|
||||
hb_face_destroy (plan->dest);
|
||||
hb_map_destroy (plan->codepoint_to_glyph);
|
||||
|
|
|
@ -53,9 +53,6 @@ struct hb_subset_plan_t
|
|||
hb_map_t *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
|
||||
hb_face_t *source;
|
||||
hb_face_t *dest;
|
||||
|
|
|
@ -171,6 +171,10 @@ static const hb_script_t ucdn_script_translate[] =
|
|||
HB_SCRIPT_MEDEFAIDRIN,
|
||||
HB_SCRIPT_OLD_SOGDIAN,
|
||||
HB_SCRIPT_SOGDIAN,
|
||||
HB_SCRIPT_ELYMAIC,
|
||||
HB_SCRIPT_NANDINAGARI,
|
||||
HB_SCRIPT_NYIAKENG_PUACHUE_HMONG,
|
||||
HB_SCRIPT_WANCHO,
|
||||
};
|
||||
|
||||
static hb_unicode_combining_class_t
|
||||
|
|
|
@ -206,6 +206,17 @@ typedef unsigned __int64 uint64_t;
|
|||
#define UCDN_SCRIPT_NUSHU 139
|
||||
#define UCDN_SCRIPT_SOYOMBO 140
|
||||
#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_CL 1
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -7,13 +7,13 @@
|
|||
* on file with this header:
|
||||
*
|
||||
* # emoji-data.txt
|
||||
* # Date: 2018-02-07, 07:55:18 GMT
|
||||
* # © 2018 Unicode®, Inc.
|
||||
* # Date: 2019-01-15, 12:10:05 GMT
|
||||
* # © 2019 Unicode®, Inc.
|
||||
* # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
||||
* # For terms of use, see http://www.unicode.org/terms_of_use.html
|
||||
* #
|
||||
* # Emoji Data for UTS #51
|
||||
* # Version: 11.0
|
||||
* # Version: 12.0
|
||||
* #
|
||||
* # For documentation and usage, see http://www.unicode.org/reports/tr51
|
||||
*/
|
||||
|
|
|
@ -37,10 +37,10 @@ HB_BEGIN_DECLS
|
|||
|
||||
|
||||
#define HB_VERSION_MAJOR 2
|
||||
#define HB_VERSION_MINOR 3
|
||||
#define HB_VERSION_MICRO 1
|
||||
#define HB_VERSION_MINOR 4
|
||||
#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) \
|
||||
((major)*10000+(minor)*100+(micro) <= \
|
||||
|
|
|
@ -215,7 +215,8 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size);
|
|||
* Compiler attributes
|
||||
*/
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
/* https://github.com/harfbuzz/harfbuzz/issues/1634 */
|
||||
#if __cplusplus < 201103L && !defined(_MSC_VER)
|
||||
|
||||
#ifndef nullptr
|
||||
#define nullptr NULL
|
||||
|
|
Binary file not shown.
|
@ -48,7 +48,7 @@ typedef short bool;
|
|||
HB_BEGIN_DECLS
|
||||
|
||||
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_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;
|
||||
}
|
||||
|
||||
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 *
|
||||
hb_subset_test_create_subset (hb_face_t *source,
|
||||
hb_subset_input_t *input)
|
||||
|
|
|
@ -110,12 +110,21 @@ test_ot_face_empty (void)
|
|||
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
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
hb_test_init (&argc, &argv);
|
||||
|
||||
hb_test_add (test_ot_face_empty);
|
||||
hb_test_add (test_ot_var_axis_on_zero_named_instance);
|
||||
|
||||
return hb_test_run();
|
||||
}
|
||||
|
|
|
@ -79,6 +79,29 @@ test_subset_glyf (void)
|
|||
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
|
||||
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);
|
||||
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_composite);
|
||||
hb_test_add (test_subset_glyf_strip_hints_invalid);
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -6,3 +6,5 @@
|
|||
../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/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]
|
||||
|
|
|
@ -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+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/ad01ab2ea1cb1a4d3a2783e2675112ef11ae6404.ttf::U+17D2,U+17D2:[uni25CC=0+635|uni17D2=0+0|uni25CC=0+635|uni17D2=0+0]
|
||||
|
|
|
@ -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/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]
|
||||
|
||||
# 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]
|
||||
|
|
|
@ -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"
|
||||
" specific character ranges. The format for specifying feature settings\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"
|
||||
" The range indices refer to the positions between Unicode characters,\n"
|
||||
" unless the --utf8-clusters is provided, in which case range indices\n"
|
||||
|
|
Loading…
Reference in New Issue