Merge branch 'master' into cff-subset

This commit is contained in:
Michiharu Ariza 2018-11-30 15:00:52 -08:00
commit 9ae954f43a
69 changed files with 390 additions and 283 deletions

View File

@ -22,28 +22,28 @@ jobs:
- run: make -j4 - run: make -j4
- run: make check || .ci/fail.sh - run: make check || .ci/fail.sh
# macos-llvm-gcc-4.2: macos-llvm-gcc-4.2:
# macos: macos:
# xcode: "8.3.3" xcode: "8.3.3"
# steps: steps:
# - checkout - checkout
# - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel freetype glib cairo - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel freetype glib cairo
# - run: wget https://packages.macports.org/llvm-gcc42/llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 - run: wget https://packages.macports.org/llvm-gcc42/llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf llvm-gcc42-2336.11_3+universal.darwin_15.i386-x86_64.tbz2
# - run: CC=$PWD/opt/local/bin/llvm-gcc-4.2 CXX=$PWD/opt/local/bin/llvm-g++-4.2 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo - run: CC=$PWD/opt/local/bin/llvm-gcc-4.2 CXX=$PWD/opt/local/bin/llvm-g++-4.2 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo
# # Ignoring assembler complains, https://stackoverflow.com/a/39867021 # Ignoring assembler complains, https://stackoverflow.com/a/39867021
# - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*'
# - run: make check || .ci/fail.sh - run: make check || .ci/fail.sh
# macos-notest-apple-gcc-i686-4.2: macos-notest-apple-gcc-i686-4.2:
# macos: macos:
# xcode: "8.3.3" xcode: "8.3.3"
# steps: steps:
# - checkout - checkout
# - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget pkg-config libtool ragel
# - run: wget https://packages.macports.org/apple-gcc42/apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 - run: wget https://packages.macports.org/apple-gcc42/apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2 && tar zxvf apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2
# - run: CPP=$PWD/opt/local/bin/i686-apple-darwin15-cpp-apple-4.2.1 CC=$PWD/opt/local/bin/i686-apple-darwin15-gcc-apple-4.2.1 CXX=$PWD/opt/local/bin/i686-apple-darwin15-g++-apple-4.2.1 ./autogen.sh - run: CPP=$PWD/opt/local/bin/i686-apple-darwin15-cpp-apple-4.2.1 CC=$PWD/opt/local/bin/i686-apple-darwin15-gcc-apple-4.2.1 CXX=$PWD/opt/local/bin/i686-apple-darwin15-g++-apple-4.2.1 ./autogen.sh
# # Ignoring assembler complains, https://stackoverflow.com/a/39867021 # Ignoring assembler complains, https://stackoverflow.com/a/39867021
# - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*' - run: make 2>&1 | grep -v -e '^/var/folders/*' -e '^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*'
macos-notest-ios: macos-notest-ios:
macos: macos:
@ -321,8 +321,8 @@ workflows:
# macOS # macOS
- macos-10.12.6-aat-fonts - macos-10.12.6-aat-fonts
- macos-10.13.6-aat-fonts - macos-10.13.6-aat-fonts
#- macos-llvm-gcc-4.2 - macos-llvm-gcc-4.2
#- macos-notest-apple-gcc-i686-4.2 - macos-notest-apple-gcc-i686-4.2
- macos-notest-ios - macos-notest-ios
# both autotools and cmake # both autotools and cmake

35
NEWS
View File

@ -1,3 +1,38 @@
Overview of changes leading to 2.2.0
Thursday, November 29, 2018
====================================
- Misc shaping bug fixes.
- Add font variations named-instance API.
- Deprecate font variations axis enumeration API and add replacement.
- AAT shaping improvements:
o Fixed 'kern' table Format 2 implementation.
o Implement 'feat' table API for feature detection.
o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'.
New API:
+hb_aat_layout_feature_type_t
+hb_aat_layout_feature_selector_t
+hb_aat_layout_get_feature_types()
+hb_aat_layout_feature_type_get_name_id
+hb_aat_layout_feature_selector_info_t
+HB_AAT_LAYOUT_NO_SELECTOR_INDEX
+hb_aat_layout_feature_type_get_selector_infos()
+hb_ot_var_axis_flags_t
+hb_ot_var_axis_info_t
+hb_ot_var_get_axis_infos()
+hb_ot_var_find_axis_info()
+hb_ot_var_get_named_instance_count()
+hb_ot_var_named_instance_get_subfamily_name_id()
+hb_ot_var_named_instance_get_postscript_name_id()
+hb_ot_var_named_instance_get_design_coords()
Deprecated API:
+HB_OT_VAR_NO_AXIS_INDEX
+hb_ot_var_axis_t
+hb_ot_var_get_axes()
+hb_ot_var_find_axis()
Overview of changes leading to 2.1.3 Overview of changes leading to 2.1.3
Friday, November 16, 2018 Friday, November 16, 2018
==================================== ====================================

View File

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

View File

@ -196,6 +196,7 @@ HB_OT_headers = \
hb-aat-layout.h \ hb-aat-layout.h \
hb-ot.h \ hb-ot.h \
hb-ot-color.h \ hb-ot-color.h \
hb-ot-deprecated.h \
hb-ot-font.h \ hb-ot-font.h \
hb-ot-layout.h \ hb-ot-layout.h \
hb-ot-math.h \ hb-ot-math.h \

View File

@ -58,7 +58,7 @@ typedef LArrayOf<Anchor> GlyphAnchors;
struct ankr struct ankr
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_ankr; enum { tableTag = HB_AAT_TAG_ankr };
inline const Anchor &get_anchor (hb_codepoint_t glyph_id, inline const Anchor &get_anchor (hb_codepoint_t glyph_id,
unsigned int i, unsigned int i,

View File

@ -116,7 +116,7 @@ struct BaselineTableFormat3Part
struct bsln struct bsln
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_bsln; enum { tableTag = HB_AAT_TAG_bsln };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -675,7 +675,7 @@ struct ClassTable
struct ObsoleteTypes struct ObsoleteTypes
{ {
static const bool extended = false; enum { extended = false };
typedef HBUINT16 HBUINT; typedef HBUINT16 HBUINT;
typedef HBUINT8 HBUSHORT; typedef HBUINT8 HBUSHORT;
typedef ClassTable<HBUINT8> ClassTypeNarrow; typedef ClassTable<HBUINT8> ClassTypeNarrow;
@ -705,7 +705,7 @@ struct ObsoleteTypes
}; };
struct ExtendedTypes struct ExtendedTypes
{ {
static const bool extended = true; enum { extended = true };
typedef HBUINT32 HBUINT; typedef HBUINT32 HBUINT;
typedef HBUINT16 HBUSHORT; typedef HBUINT16 HBUSHORT;
typedef Lookup<HBUINT16> ClassTypeNarrow; typedef Lookup<HBUINT16> ClassTypeNarrow;

View File

@ -155,7 +155,7 @@ struct FeatureName
struct feat struct feat
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_feat; enum { tableTag = HB_AAT_TAG_feat };
inline bool has_data (void) const { return version.to_int (); } inline bool has_data (void) const { return version.to_int (); }

View File

@ -382,7 +382,7 @@ struct JustificationHeader
struct just struct just
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_just; enum { tableTag = HB_AAT_TAG_just };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -211,7 +211,7 @@ struct KerxSubTableFormat1
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = true; enum { in_place = true };
enum enum
{ {
DontAdvance = Format1EntryT::DontAdvance, DontAdvance = Format1EntryT::DontAdvance,
@ -472,7 +472,7 @@ struct KerxSubTableFormat4
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = true; enum { in_place = true };
enum Flags enum Flags
{ {
Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */ Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */
@ -947,7 +947,7 @@ struct KerxTable
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
if (unlikely (!thiz()->version.sanitize (c) || if (unlikely (!thiz()->version.sanitize (c) ||
thiz()->version < T::minVersion || (unsigned) thiz()->version < (unsigned) T::minVersion ||
!thiz()->tableCount.sanitize (c))) !thiz()->tableCount.sanitize (c)))
return_trace (false); return_trace (false);
@ -982,8 +982,8 @@ struct kerx : KerxTable<kerx>
{ {
friend struct KerxTable<kerx>; friend struct KerxTable<kerx>;
static const hb_tag_t tableTag = HB_AAT_TAG_kerx; enum { tableTag = HB_AAT_TAG_kerx };
static const uint16_t minVersion = 2; enum { minVersion = 2u };
typedef KerxSubTableHeader SubTableHeader; typedef KerxSubTableHeader SubTableHeader;
typedef SubTableHeader::Types Types; typedef SubTableHeader::Types Types;

View File

@ -40,7 +40,7 @@ typedef ArrayOf<HBINT16> LigCaretClassEntry;
struct lcar struct lcar
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_lcar; enum { tableTag = HB_AAT_TAG_lcar };
inline unsigned int get_lig_carets (hb_font_t *font, inline unsigned int get_lig_carets (hb_font_t *font,
hb_direction_t direction, hb_direction_t direction,

View File

@ -54,7 +54,7 @@ struct RearrangementSubtable
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = true; enum { in_place = true };
enum Flags enum Flags
{ {
MarkFirst = 0x8000, /* If set, make the current glyph the first MarkFirst = 0x8000, /* If set, make the current glyph the first
@ -204,7 +204,7 @@ struct ContextualSubtable
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = true; enum { in_place = true };
enum Flags enum Flags
{ {
SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */ SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */
@ -249,7 +249,7 @@ struct ContextualSubtable
{ {
if (entry->data.markIndex != 0xFFFF) if (entry->data.markIndex != 0xFFFF)
{ {
const Lookup<GlyphID> &lookup = subs[entry->data.markIndex]; const Lookup<GlyphID> &lookup = subs[(unsigned) entry->data.markIndex];
replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs); replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs);
} }
} }
@ -274,7 +274,7 @@ struct ContextualSubtable
{ {
if (entry->data.currentIndex != 0xFFFF) if (entry->data.currentIndex != 0xFFFF)
{ {
const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex]; const Lookup<GlyphID> &lookup = subs[(unsigned) entry->data.currentIndex];
replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs); replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs);
} }
} }
@ -424,7 +424,7 @@ struct LigatureSubtable
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = false; enum { in_place = false };
enum enum
{ {
DontAdvance = LigatureEntryT::DontAdvance, DontAdvance = LigatureEntryT::DontAdvance,
@ -660,7 +660,7 @@ struct InsertionSubtable
struct driver_context_t struct driver_context_t
{ {
static const bool in_place = false; enum { in_place = false };
enum Flags enum Flags
{ {
SetMark = 0x8000, /* If set, mark the current glyph. */ SetMark = 0x8000, /* If set, mark the current glyph. */
@ -1096,7 +1096,7 @@ struct Chain
template <typename Types> template <typename Types>
struct mortmorx struct mortmorx
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_morx; enum { tableTag = HB_AAT_TAG_morx };
inline bool has_data (void) const { return version != 0; } inline bool has_data (void) const { return version != 0; }
@ -1158,11 +1158,11 @@ struct mortmorx
struct morx : mortmorx<ExtendedTypes> struct morx : mortmorx<ExtendedTypes>
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_morx; enum { tableTag = HB_AAT_TAG_morx };
}; };
struct mort : mortmorx<ObsoleteTypes> struct mort : mortmorx<ObsoleteTypes>
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_mort; enum { tableTag = HB_AAT_TAG_mort };
}; };

View File

@ -166,7 +166,7 @@ struct TrackData
struct trak struct trak
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_trak; enum { tableTag = HB_AAT_TAG_trak };
inline bool has_data (void) const { return version.to_int (); } inline bool has_data (void) const { return version.to_int (); }

View File

@ -318,7 +318,7 @@ _hb_aat_language_get (hb_face_t *face,
* *
* Return value: Number of all available feature types. * Return value: Number of all available feature types.
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
unsigned int unsigned int
hb_aat_layout_get_feature_types (hb_face_t *face, hb_aat_layout_get_feature_types (hb_face_t *face,
@ -336,7 +336,7 @@ hb_aat_layout_get_feature_types (hb_face_t *face,
* *
* Return value: Name ID index * Return value: Name ID index
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
hb_ot_name_id_t hb_ot_name_id_t
hb_aat_layout_feature_type_get_name_id (hb_face_t *face, hb_aat_layout_feature_type_get_name_id (hb_face_t *face,
@ -358,7 +358,7 @@ hb_aat_layout_feature_type_get_name_id (hb_face_t *face,
* *
* Return value: Number of all available feature selectors. * Return value: Number of all available feature selectors.
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
unsigned int unsigned int
hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face, hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face,

View File

@ -39,7 +39,7 @@ HB_BEGIN_DECLS
* hb_aat_layout_feature_type_t: * hb_aat_layout_feature_type_t:
* *
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
typedef enum typedef enum
{ {
@ -92,7 +92,7 @@ typedef enum
* hb_aat_layout_feature_selector_t: * hb_aat_layout_feature_selector_t:
* *
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
typedef enum typedef enum
{ {

View File

@ -60,7 +60,7 @@ struct FTStringRange
struct ltag struct ltag
{ {
static const hb_tag_t tableTag = HB_AAT_TAG_ltag; enum { tableTag = HB_AAT_TAG_ltag };
inline hb_language_t get_language (unsigned int i) const inline hb_language_t get_language (unsigned int i) const
{ {

View File

@ -598,7 +598,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
} else { } else {
active_feature_t *feature = active_features.find (&event->feature); active_feature_t *feature = active_features.find (&event->feature);
if (feature) if (feature)
active_features.remove (feature - active_features); active_features.remove (feature - active_features.arrayZ ());
} }
} }
} }

View File

@ -52,6 +52,7 @@ HB_BEGIN_DECLS
#ifndef HB_DISABLE_DEPRECATED #ifndef HB_DISABLE_DEPRECATED
#define HB_SCRIPT_CANADIAN_ABORIGINAL HB_SCRIPT_CANADIAN_SYLLABICS #define HB_SCRIPT_CANADIAN_ABORIGINAL HB_SCRIPT_CANADIAN_SYLLABICS
#define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT #define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT
@ -217,66 +218,6 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
hb_direction_t direction, hb_direction_t direction,
hb_position_t *x, hb_position_t *y); hb_position_t *x, hb_position_t *y);
/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t
hb_ot_layout_table_choose_script (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *script_tags,
unsigned int *script_index,
hb_tag_t *chosen_script);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t
hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
hb_tag_t language_tag,
unsigned int *language_index);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void
hb_ot_tags_from_script (hb_script_t script,
hb_tag_t *script_tag_1,
hb_tag_t *script_tag_2);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t
hb_ot_tag_from_language (hb_language_t language);
typedef unsigned int hb_ot_name_id_t; /* Since is in hb-ot.h */
/**
* HB_OT_VAR_NO_AXIS_INDEX:
*
* Since: 1.4.2
* Deprecated: REPLACEME
*/
#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu
/**
* hb_ot_var_axis_t:
*
* Since: 1.4.2
* Deprecated: REPLACEME
*/
typedef struct hb_ot_var_axis_t
{
hb_tag_t tag;
hb_ot_name_id_t name_id;
float min_value;
float default_value;
float max_value;
} hb_ot_var_axis_t;
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int
hb_ot_var_get_axes (hb_face_t *face,
unsigned int start_offset,
unsigned int *axes_count /* IN/OUT */,
hb_ot_var_axis_t *axes_array /* OUT */);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t
hb_ot_var_find_axis (hb_face_t *face,
hb_tag_t axis_tag,
unsigned int *axis_index,
hb_ot_var_axis_t *axis_info);
#endif #endif

View File

@ -735,26 +735,26 @@ inline hb_sorted_array_t<T> hb_sorted_array (T *array, unsigned int len)
struct HbOpOr struct HbOpOr
{ {
static const bool passthru_left = true; enum { passthru_left = true };
static const bool passthru_right = true; enum { passthru_right = true };
template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; }
}; };
struct HbOpAnd struct HbOpAnd
{ {
static const bool passthru_left = false; enum { passthru_left = false };
static const bool passthru_right = false; enum { passthru_right = false };
template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; }
}; };
struct HbOpMinus struct HbOpMinus
{ {
static const bool passthru_left = true; enum { passthru_left = true };
static const bool passthru_right = false; enum { passthru_right = false };
template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; }
}; };
struct HbOpXor struct HbOpXor
{ {
static const bool passthru_left = true; enum { passthru_left = true };
static const bool passthru_right = true; enum { passthru_right = true };
template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; } template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; }
}; };

View File

@ -647,8 +647,8 @@ _hb_face_builder_data_reference_blob (hb_face_builder_data_t *data)
bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2')); bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag; hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
Supplier<hb_tag_t> tags_supplier (&data->tables[0].tag, table_count, sizeof (data->tables[0])); Supplier<hb_tag_t> tags_supplier (&data->tables[0u].tag, table_count, data->tables.item_size);
Supplier<hb_blob_t *> blobs_supplier (&data->tables[0].blob, table_count, sizeof (data->tables[0])); Supplier<hb_blob_t *> blobs_supplier (&data->tables[0u].blob, table_count, data->tables.item_size);
bool ret = f->serialize_single (&c, bool ret = f->serialize_single (&c,
sfnt_tag, sfnt_tag,
tags_supplier, tags_supplier,

View File

@ -65,7 +65,8 @@ hb_icu_script_from_script (hb_script_t script)
if (unlikely (script == HB_SCRIPT_INVALID)) if (unlikely (script == HB_SCRIPT_INVALID))
return USCRIPT_INVALID_CODE; return USCRIPT_INVALID_CODE;
for (unsigned int i = 0; i < USCRIPT_CODE_LIMIT; i++) unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT);
for (unsigned int i = 0; i < numScriptCode; i++)
if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script)) if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script))
return (UScriptCode) i; return (UScriptCode) i;

View File

@ -117,8 +117,8 @@ static inline Type& StructAfter(TObject &X)
enum { min_size = (size) } enum { min_size = (size) }
#define DEFINE_SIZE_ARRAY(size, array) \ #define DEFINE_SIZE_ARRAY(size, array) \
DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \ DEFINE_COMPILES_ASSERTION ((void) (array)[0u].static_size) \
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \ DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0u])) \
enum { null_size = (size) }; \ enum { null_size = (size) }; \
enum { min_size = (size) } enum { min_size = (size) }
@ -658,7 +658,7 @@ struct Supplier
} }
inline Supplier (const hb_vector_t<Type> *v) inline Supplier (const hb_vector_t<Type> *v)
{ {
head = *v; head = (const Type *) *v;
len = v->len; len = v->len;
stride = sizeof (Type); stride = sizeof (Type);
} }
@ -721,7 +721,7 @@ struct BEInt<Type, 2>
} }
inline operator Type (void) const inline operator Type (void) const
{ {
#if defined(__GNUC__) || defined(__clang__) #if (defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)
/* Spoon-feed the compiler a big-endian integer with alignment 1. /* Spoon-feed the compiler a big-endian integer with alignment 1.
* https://github.com/harfbuzz/harfbuzz/pull/1398 */ * https://github.com/harfbuzz/harfbuzz/pull/1398 */
struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; struct __attribute__((packed)) packed_uint16_t { uint16_t v; };

View File

@ -168,7 +168,7 @@ struct hb_map_t
inline hb_codepoint_t operator [] (unsigned int key) const inline hb_codepoint_t operator [] (unsigned int key) const
{ return get (key); } { return get (key); }
static const hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID; enum { INVALID = HB_MAP_VALUE_INVALID };
inline void clear (void) inline void clear (void)
{ {

View File

@ -77,6 +77,7 @@ struct hb_static_size
/* /*
* Null() * Null()
*/ */
extern HB_INTERNAL extern HB_INTERNAL
hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)];
@ -86,7 +87,13 @@ static inline Type const & Null (void) {
static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
return *reinterpret_cast<Type const *> (_hb_NullPool); return *reinterpret_cast<Type const *> (_hb_NullPool);
} }
#define Null(Type) Null<typename hb_remove_const (typename hb_remove_reference (Type))> () template <typename QType>
struct NullHelper
{
typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type;
static inline const Type & get_null (void) { return Null<Type> (); }
};
#define Null(Type) NullHelper<Type>::get_null ()
/* Specializations for arbitrary-content Null objects expressed in bytes. */ /* Specializations for arbitrary-content Null objects expressed in bytes. */
#define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \ #define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \
@ -129,17 +136,23 @@ static inline Type& Crap (void) {
memcpy (obj, &Null(Type), sizeof (*obj)); memcpy (obj, &Null(Type), sizeof (*obj));
return *obj; return *obj;
} }
#define Crap(Type) Crap<typename hb_remove_const (typename hb_remove_reference (Type))> () template <typename QType>
struct CrapHelper
{
typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type;
static inline Type & get_crap (void) { return Crap<Type> (); }
};
#define Crap(Type) CrapHelper<Type>::get_crap ()
template <typename Type> template <typename Type>
struct CrapOrNull { struct CrapOrNullHelper {
static inline Type & get (void) { return Crap(Type); } static inline Type & get (void) { return Crap(Type); }
}; };
template <typename Type> template <typename Type>
struct CrapOrNull<const Type> { struct CrapOrNullHelper<const Type> {
static inline Type const & get (void) { return Null(Type); } static inline const Type & get (void) { return Null(Type); }
}; };
#define CrapOrNull(Type) CrapOrNull<Type>::get () #define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
/* /*

View File

@ -495,7 +495,8 @@ struct CmapSubtableLongSegmented
{ {
TRACE_SERIALIZE (this); TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false); if (unlikely (!c->extend_min (*this))) return_trace (false);
Supplier<CmapSubtableLongGroup> supplier (group_data, group_data.len); Supplier<CmapSubtableLongGroup> supplier ((const OT::CmapSubtableLongGroup*) group_data,
group_data.len);
if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false); if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false);
return true; return true;
} }
@ -842,7 +843,7 @@ struct EncodingRecord
struct cmap struct cmap
{ {
static const hb_tag_t tableTag = HB_OT_TAG_cmap; enum { tableTag = HB_OT_TAG_cmap };
struct subset_plan struct subset_plan
{ {

View File

@ -332,7 +332,7 @@ struct CBLC
{ {
friend struct CBDT; friend struct CBDT;
static const hb_tag_t tableTag = HB_OT_TAG_CBLC; enum { tableTag = HB_OT_TAG_CBLC };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {
@ -378,7 +378,7 @@ struct CBLC
struct CBDT struct CBDT
{ {
static const hb_tag_t tableTag = HB_OT_TAG_CBDT; enum { tableTag = HB_OT_TAG_CBDT };
struct accelerator_t struct accelerator_t
{ {

View File

@ -87,7 +87,7 @@ struct BaseGlyphRecord
struct COLR struct COLR
{ {
static const hb_tag_t tableTag = HB_OT_TAG_COLR; enum { tableTag = HB_OT_TAG_COLR };
inline bool has_data (void) const { return numBaseGlyphs; } inline bool has_data (void) const { return numBaseGlyphs; }

View File

@ -110,12 +110,12 @@ typedef HBUINT32 BGRAColor;
struct CPAL struct CPAL
{ {
static const hb_tag_t tableTag = HB_OT_TAG_CPAL; enum { tableTag = HB_OT_TAG_CPAL };
inline bool has_data (void) const { return numPalettes; } inline bool has_data (void) const { return numPalettes; }
inline unsigned int get_size (void) const inline unsigned int get_size (void) const
{ return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); } { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0u]); }
inline unsigned int get_palette_count () const { return numPalettes; } inline unsigned int get_palette_count () const { return numPalettes; }
inline unsigned int get_color_count () const { return numColors; } inline unsigned int get_color_count () const { return numColors; }

View File

@ -130,7 +130,7 @@ struct SBIXStrike
struct sbix struct sbix
{ {
static const hb_tag_t tableTag = HB_OT_TAG_sbix; enum { tableTag = HB_OT_TAG_sbix };
inline bool has_data (void) const { return version; } inline bool has_data (void) const { return version; }

View File

@ -73,7 +73,7 @@ struct SVGDocumentIndexEntry
struct SVG struct SVG
{ {
static const hb_tag_t tableTag = HB_OT_TAG_SVG; enum { tableTag = HB_OT_TAG_SVG };
inline bool has_data (void) const { return svgDocEntries; } inline bool has_data (void) const { return svgDocEntries; }

107
src/hb-ot-deprecated.h Normal file
View File

@ -0,0 +1,107 @@
/*
* Copyright © 2018 Google, Inc.
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Google Author(s): Behdad Esfahbod
*/
#ifndef HB_OT_H_IN
#error "Include <hb-ot.h> instead."
#endif
#ifndef HB_OT_DEPRECATED_H
#define HB_OT_DEPRECATED_H
#include "hb.h"
#include "hb-ot-name.h"
HB_BEGIN_DECLS
#ifndef HB_DISABLE_DEPRECATED
/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t
hb_ot_layout_table_choose_script (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *script_tags,
unsigned int *script_index,
hb_tag_t *chosen_script);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t
hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
hb_tag_t language_tag,
unsigned int *language_index);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void
hb_ot_tags_from_script (hb_script_t script,
hb_tag_t *script_tag_1,
hb_tag_t *script_tag_2);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t
hb_ot_tag_from_language (hb_language_t language);
/**
* HB_OT_VAR_NO_AXIS_INDEX:
*
* Since: 1.4.2
* Deprecated: 2.2.0
*/
#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu
/**
* hb_ot_var_axis_t:
*
* Since: 1.4.2
* Deprecated: 2.2.0
*/
typedef struct hb_ot_var_axis_t
{
hb_tag_t tag;
hb_ot_name_id_t name_id;
float min_value;
float default_value;
float max_value;
} hb_ot_var_axis_t;
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int
hb_ot_var_get_axes (hb_face_t *face,
unsigned int start_offset,
unsigned int *axes_count /* IN/OUT */,
hb_ot_var_axis_t *axes_array /* OUT */);
HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t
hb_ot_var_find_axis (hb_face_t *face,
hb_tag_t axis_tag,
unsigned int *axis_index,
hb_ot_var_axis_t *axis_info);
#endif
HB_END_DECLS
#endif /* HB_OT_DEPRECATED_H */

View File

@ -45,7 +45,7 @@ struct loca
{ {
friend struct glyf; friend struct glyf;
static const hb_tag_t tableTag = HB_OT_TAG_loca; enum { tableTag = HB_OT_TAG_loca };
inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
{ {
@ -71,7 +71,7 @@ struct loca
struct glyf struct glyf
{ {
static const hb_tag_t tableTag = HB_OT_TAG_glyf; enum { tableTag = HB_OT_TAG_glyf };
inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
{ {

View File

@ -123,7 +123,7 @@ struct DeviceRecord
struct hdmx struct hdmx
{ {
static const hb_tag_t tableTag = HB_OT_TAG_hdmx; enum { tableTag = HB_OT_TAG_hdmx };
inline unsigned int get_size (void) const inline unsigned int get_size (void) const
{ {

View File

@ -45,7 +45,7 @@ struct head
{ {
friend struct OffsetTable; friend struct OffsetTable;
static const hb_tag_t tableTag = HB_OT_TAG_head; enum { tableTag = HB_OT_TAG_head };
inline unsigned int get_upem (void) const inline unsigned int get_upem (void) const
{ {

View File

@ -86,10 +86,10 @@ struct _hea
}; };
struct hhea : _hea<hhea> { struct hhea : _hea<hhea> {
static const hb_tag_t tableTag = HB_OT_TAG_hhea; enum { tableTag = HB_OT_TAG_hhea };
}; };
struct vhea : _hea<vhea> { struct vhea : _hea<vhea> {
static const hb_tag_t tableTag = HB_OT_TAG_vhea; enum { tableTag = HB_OT_TAG_vhea };
}; };

View File

@ -192,7 +192,7 @@ struct hmtxvmtx
default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face); default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
bool got_font_extents = false; bool got_font_extents = false;
if (T::os2Tag) if (T::os2Tag != HB_TAG_NONE)
{ {
#define USE_TYPO_METRICS (1u<<7) #define USE_TYPO_METRICS (1u<<7)
if (0 != (face->table.OS2->fsSelection & USE_TYPO_METRICS)) if (0 != (face->table.OS2->fsSelection & USE_TYPO_METRICS))
@ -327,14 +327,14 @@ struct hmtxvmtx
}; };
struct hmtx : hmtxvmtx<hmtx, hhea> { struct hmtx : hmtxvmtx<hmtx, hhea> {
static const hb_tag_t tableTag = HB_OT_TAG_hmtx; enum { tableTag = HB_OT_TAG_hmtx };
static const hb_tag_t variationsTag = HB_OT_TAG_HVAR; enum { variationsTag = HB_OT_TAG_HVAR };
static const hb_tag_t os2Tag = HB_OT_TAG_OS2; enum { os2Tag = HB_OT_TAG_OS2 };
}; };
struct vmtx : hmtxvmtx<vmtx, vhea> { struct vmtx : hmtxvmtx<vmtx, vhea> {
static const hb_tag_t tableTag = HB_OT_TAG_vmtx; enum { tableTag = HB_OT_TAG_vmtx };
static const hb_tag_t variationsTag = HB_OT_TAG_VVAR; enum { variationsTag = HB_OT_TAG_VVAR };
static const hb_tag_t os2Tag = HB_TAG_NONE; enum { os2Tag = HB_TAG_NONE };
}; };
struct hmtx_accelerator_t : hmtx::accelerator_t {}; struct hmtx_accelerator_t : hmtx::accelerator_t {};

View File

@ -56,7 +56,7 @@ struct KernSubTableFormat3
if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount)) if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount))
return 0; return 0;
unsigned int i = leftC * rightClassCount + rightC; unsigned int i = leftC * rightClassCount + rightC;
return kernValue[kernIndex[i]]; return kernValue[(unsigned) kernIndex[i]];
} }
inline bool apply (AAT::hb_aat_apply_context_t *c) const inline bool apply (AAT::hb_aat_apply_context_t *c) const
@ -160,7 +160,7 @@ struct KernSubTable
struct KernOTSubTableHeader struct KernOTSubTableHeader
{ {
static const bool apple = false; enum { apple = false };
typedef AAT::ObsoleteTypes Types; typedef AAT::ObsoleteTypes Types;
inline unsigned int tuple_count (void) const { return 0; } inline unsigned int tuple_count (void) const { return 0; }
@ -197,8 +197,8 @@ struct KernOT : AAT::KerxTable<KernOT>
{ {
friend struct AAT::KerxTable<KernOT>; friend struct AAT::KerxTable<KernOT>;
static const hb_tag_t tableTag = HB_OT_TAG_kern; enum { tableTag = HB_OT_TAG_kern };
static const uint16_t minVersion = 0; enum { minVersion = 0u };
typedef KernOTSubTableHeader SubTableHeader; typedef KernOTSubTableHeader SubTableHeader;
typedef SubTableHeader::Types Types; typedef SubTableHeader::Types Types;
@ -215,7 +215,7 @@ struct KernOT : AAT::KerxTable<KernOT>
struct KernAATSubTableHeader struct KernAATSubTableHeader
{ {
static const bool apple = true; enum { apple = true };
typedef AAT::ObsoleteTypes Types; typedef AAT::ObsoleteTypes Types;
inline unsigned int tuple_count (void) const { return 0; } inline unsigned int tuple_count (void) const { return 0; }
@ -252,8 +252,8 @@ struct KernAAT : AAT::KerxTable<KernAAT>
{ {
friend struct AAT::KerxTable<KernAAT>; friend struct AAT::KerxTable<KernAAT>;
static const hb_tag_t tableTag = HB_OT_TAG_kern; enum { tableTag = HB_OT_TAG_kern };
static const uint32_t minVersion = 0x00010000u; enum { minVersion = 0x00010000u };
typedef KernAATSubTableHeader SubTableHeader; typedef KernAATSubTableHeader SubTableHeader;
typedef SubTableHeader::Types Types; typedef SubTableHeader::Types Types;
@ -269,7 +269,7 @@ struct KernAAT : AAT::KerxTable<KernAAT>
struct kern struct kern
{ {
static const hb_tag_t tableTag = HB_OT_TAG_kern; enum { tableTag = HB_OT_TAG_kern };
inline bool has_data (void) const { return u.version32; } inline bool has_data (void) const { return u.version32; }
inline unsigned int get_type (void) const { return u.major; } inline unsigned int get_type (void) const { return u.major; }

View File

@ -465,7 +465,7 @@ struct Axis
struct BASE struct BASE
{ {
static const hb_tag_t tableTag = HB_OT_TAG_BASE; enum { tableTag = HB_OT_TAG_BASE };
inline const Axis &get_axis (hb_direction_t direction) const inline const Axis &get_axis (hb_direction_t direction) const
{ return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; } { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; }

View File

@ -340,7 +340,7 @@ struct MarkGlyphSets
struct GDEF struct GDEF
{ {
static const hb_tag_t tableTag = HB_OT_TAG_GDEF; enum { tableTag = HB_OT_TAG_GDEF };
enum GlyphClasses { enum GlyphClasses {
UnclassifiedGlyph = 0, UnclassifiedGlyph = 0,

View File

@ -625,8 +625,8 @@ struct PairSet
inline bool intersects (const hb_set_t *glyphs, inline bool intersects (const hb_set_t *glyphs,
const ValueFormat *valueFormats) const const ValueFormat *valueFormats) const
{ {
unsigned int len1 = valueFormats[0].get_len (); unsigned int len1 = valueFormats[0u].get_len ();
unsigned int len2 = valueFormats[1].get_len (); unsigned int len2 = valueFormats[1u].get_len ();
unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
const PairValueRecord *record = &firstPairValueRecord; const PairValueRecord *record = &firstPairValueRecord;
@ -644,8 +644,8 @@ struct PairSet
const ValueFormat *valueFormats) const const ValueFormat *valueFormats) const
{ {
TRACE_COLLECT_GLYPHS (this); TRACE_COLLECT_GLYPHS (this);
unsigned int len1 = valueFormats[0].get_len (); unsigned int len1 = valueFormats[0u].get_len ();
unsigned int len2 = valueFormats[1].get_len (); unsigned int len2 = valueFormats[1u].get_len ();
unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
const PairValueRecord *record = &firstPairValueRecord; const PairValueRecord *record = &firstPairValueRecord;
@ -658,8 +658,8 @@ struct PairSet
{ {
TRACE_APPLY (this); TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer; hb_buffer_t *buffer = c->buffer;
unsigned int len1 = valueFormats[0].get_len (); unsigned int len1 = valueFormats[0u].get_len ();
unsigned int len2 = valueFormats[1].get_len (); unsigned int len2 = valueFormats[1u].get_len ();
unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2);
unsigned int count = len; unsigned int count = len;
@ -681,8 +681,8 @@ struct PairSet
else else
{ {
/* Note the intentional use of "|" instead of short-circuit "||". */ /* Note the intentional use of "|" instead of short-circuit "||". */
if (valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()) | if (valueFormats[0u].apply_value (c, this, &record->values[0u], buffer->cur_pos()) |
valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos])) valueFormats[1u].apply_value (c, this, &record->values[len1], buffer->pos[pos]))
buffer->unsafe_to_break (buffer->idx, pos + 1); buffer->unsafe_to_break (buffer->idx, pos + 1);
if (len2) if (len2)
pos++; pos++;
@ -698,7 +698,7 @@ struct PairSet
{ {
const void *base; const void *base;
const ValueFormat *valueFormats; const ValueFormat *valueFormats;
unsigned int len1; /* valueFormats[0].get_len() */ unsigned int len1; /* valueFormats[0u].get_len() */
unsigned int stride; /* 1 + len1 + len2 */ unsigned int stride; /* 1 + len1 + len2 */
}; };
@ -713,8 +713,8 @@ struct PairSet
unsigned int count = len; unsigned int count = len;
const PairValueRecord *record = &firstPairValueRecord; const PairValueRecord *record = &firstPairValueRecord;
return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride) && return_trace (closure->valueFormats[0u].sanitize_values_stride_unsafe (c, closure->base, &record->values[0u], count, closure->stride) &&
closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride)); closure->valueFormats[1u].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
} }
protected: protected:
@ -781,8 +781,8 @@ struct PairPosFormat1
if (!c->check_struct (this)) return_trace (false); if (!c->check_struct (this)) return_trace (false);
unsigned int len1 = valueFormat[0].get_len (); unsigned int len1 = valueFormat[0u].get_len ();
unsigned int len2 = valueFormat[1].get_len (); unsigned int len2 = valueFormat[1u].get_len ();
PairSet::sanitize_closure_t closure = PairSet::sanitize_closure_t closure =
{ {
this, this,
@ -799,10 +799,10 @@ struct PairPosFormat1
OffsetTo<Coverage> OffsetTo<Coverage>
coverage; /* Offset to Coverage table--from coverage; /* Offset to Coverage table--from
* beginning of subtable */ * beginning of subtable */
ValueFormat valueFormat[2]; /* [0] Defines the types of data in ValueFormat valueFormat[2u]; /* [0u] Defines the types of data in
* ValueRecord1--for the first glyph * ValueRecord1--for the first glyph
* in the pair--may be zero (0) */ * in the pair--may be zero (0) */
/* [1] Defines the types of data in /* [1u] Defines the types of data in
* ValueRecord2--for the second glyph * ValueRecord2--for the second glyph
* in the pair--may be zero (0) */ * in the pair--may be zero (0) */
OffsetArrayOf<PairSet> OffsetArrayOf<PairSet>
@ -885,7 +885,7 @@ struct PairPosFormat2
return_trace (c->check_range ((const void *) values, return_trace (c->check_range ((const void *) values,
count, count,
record_size) && record_size) &&
valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) && valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0u], count, stride) &&
valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride)); valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride));
} }
@ -1628,7 +1628,7 @@ struct PosLookup : Lookup
struct GPOS : GSUBGPOS struct GPOS : GSUBGPOS
{ {
static const hb_tag_t tableTag = HB_OT_TAG_GPOS; enum { tableTag = HB_OT_TAG_GPOS };
inline const PosLookup& get_lookup (unsigned int i) const inline const PosLookup& get_lookup (unsigned int i) const
{ return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); } { return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); }

View File

@ -1475,7 +1475,7 @@ struct SubstLookup : Lookup
struct GSUB : GSUBGPOS struct GSUB : GSUBGPOS
{ {
static const hb_tag_t tableTag = HB_OT_TAG_GSUB; enum { tableTag = HB_OT_TAG_GSUB };
inline const SubstLookup& get_lookup (unsigned int i) const inline const SubstLookup& get_lookup (unsigned int i) const
{ return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); } { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }

View File

@ -1350,7 +1350,7 @@ struct Rule
return_trace (inputCount.sanitize (c) && return_trace (inputCount.sanitize (c) &&
lookupCount.sanitize (c) && lookupCount.sanitize (c) &&
c->check_range (inputZ.arrayZ, c->check_range (inputZ.arrayZ,
inputZ[0].static_size * (inputCount ? inputCount - 1 : 0) + inputZ.item_size * (inputCount ? inputCount - 1 : 0) +
LookupRecord::static_size * lookupCount)); LookupRecord::static_size * lookupCount));
} }
@ -1672,7 +1672,7 @@ struct ContextFormat3
{ {
inline bool intersects (const hb_set_t *glyphs) const inline bool intersects (const hb_set_t *glyphs) const
{ {
if (!(this+coverageZ[0]).intersects (glyphs)) if (!(this+coverageZ[0u]).intersects (glyphs))
return false; return false;
struct ContextClosureLookupContext lookup_context = { struct ContextClosureLookupContext lookup_context = {
@ -1687,7 +1687,7 @@ struct ContextFormat3
inline void closure (hb_closure_context_t *c) const inline void closure (hb_closure_context_t *c) const
{ {
TRACE_CLOSURE (this); TRACE_CLOSURE (this);
if (!(this+coverageZ[0]).intersects (c->glyphs)) if (!(this+coverageZ[0u]).intersects (c->glyphs))
return; return;
const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
@ -1704,7 +1704,7 @@ struct ContextFormat3
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{ {
TRACE_COLLECT_GLYPHS (this); TRACE_COLLECT_GLYPHS (this);
(this+coverageZ[0]).add_coverage (c->input); (this+coverageZ[0u]).add_coverage (c->input);
const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
struct ContextCollectGlyphsLookupContext lookup_context = { struct ContextCollectGlyphsLookupContext lookup_context = {
@ -1731,12 +1731,12 @@ struct ContextFormat3
} }
inline const Coverage &get_coverage (void) const inline const Coverage &get_coverage (void) const
{ return this+coverageZ[0]; } { return this+coverageZ[0u]; }
inline bool apply (hb_ot_apply_context_t *c) const inline bool apply (hb_ot_apply_context_t *c) const
{ {
TRACE_APPLY (this); TRACE_APPLY (this);
unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint); unsigned int index = (this+coverageZ[0u]).get_coverage (c->buffer->cur().codepoint);
if (likely (index == NOT_COVERED)) return_trace (false); if (likely (index == NOT_COVERED)) return_trace (false);
const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
@ -1759,7 +1759,7 @@ struct ContextFormat3
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
if (!c->check_struct (this)) return_trace (false); if (!c->check_struct (this)) return_trace (false);
unsigned int count = glyphCount; unsigned int count = glyphCount;
if (!count) return_trace (false); /* We want to access coverageZ[0] freely. */ if (!count) return_trace (false); /* We want to access coverageZ[0u] freely. */
if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false); if (!c->check_array (coverageZ.arrayZ, count)) return_trace (false);
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
if (!coverageZ[i].sanitize (c, this)) return_trace (false); if (!coverageZ[i].sanitize (c, this)) return_trace (false);
@ -1838,7 +1838,7 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs,
{ {
return intersects_array (glyphs, return intersects_array (glyphs,
backtrackCount, backtrack, backtrackCount, backtrack,
lookup_context.funcs.intersects, lookup_context.intersects_data[0]) lookup_context.funcs.intersects, lookup_context.intersects_data[0u])
&& intersects_array (glyphs, && intersects_array (glyphs,
inputCount ? inputCount - 1 : 0, input, inputCount ? inputCount - 1 : 0, input,
lookup_context.funcs.intersects, lookup_context.intersects_data[1]) lookup_context.funcs.intersects, lookup_context.intersects_data[1])

View File

@ -195,7 +195,7 @@ struct JstfScript
struct JSTF struct JSTF
{ {
static const hb_tag_t tableTag = HB_OT_TAG_JSTF; enum { tableTag = HB_OT_TAG_JSTF };
inline unsigned int get_script_count (void) const inline unsigned int get_script_count (void) const
{ return scriptList.len; } { return scriptList.len; }

View File

@ -1299,7 +1299,7 @@ hb_ot_layout_feature_get_characters (hb_face_t *face,
struct GSUBProxy struct GSUBProxy
{ {
enum { table_index = 0 }; enum { table_index = 0 };
static const bool inplace = false; enum { inplace = false };
typedef OT::SubstLookup Lookup; typedef OT::SubstLookup Lookup;
GSUBProxy (hb_face_t *face) : GSUBProxy (hb_face_t *face) :
@ -1313,7 +1313,7 @@ struct GSUBProxy
struct GPOSProxy struct GPOSProxy
{ {
enum { table_index = 1 }; enum { table_index = 1 };
static const bool inplace = true; enum { inplace = true };
typedef OT::PosLookup Lookup; typedef OT::PosLookup Lookup;
GPOSProxy (hb_face_t *face) : GPOSProxy (hb_face_t *face) :

View File

@ -680,7 +680,7 @@ struct MathVariants
struct MATH struct MATH
{ {
static const hb_tag_t tableTag = HB_OT_TAG_MATH; enum { tableTag = HB_OT_TAG_MATH };
inline bool has_data (void) const { return version.to_int (); } inline bool has_data (void) const { return version.to_int (); }

View File

@ -71,7 +71,7 @@ struct maxpV1Tail
struct maxp struct maxp
{ {
static const hb_tag_t tableTag = HB_OT_TAG_maxp; enum { tableTag = HB_OT_TAG_maxp };
inline unsigned int get_num_glyphs (void) const inline unsigned int get_num_glyphs (void) const
{ {

View File

@ -151,10 +151,10 @@ _hb_ot_name_entry_cmp (const void *pa, const void *pb)
struct name struct name
{ {
static const hb_tag_t tableTag = HB_OT_TAG_name; enum { tableTag = HB_OT_TAG_name };
inline unsigned int get_size (void) const inline unsigned int get_size (void) const
{ return min_size + count * nameRecordZ[0].min_size; } { return min_size + count * nameRecordZ.item_size; }
inline bool sanitize_records (hb_sanitize_context_t *c) const { inline bool sanitize_records (hb_sanitize_context_t *c) const {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
@ -189,7 +189,7 @@ struct name
this->names.init (); this->names.init ();
this->names.alloc (all_names.len); this->names.alloc (all_names.len);
for (uint16_t i = 0; i < all_names.len; i++) for (unsigned int i = 0; i < all_names.len; i++)
{ {
hb_ot_name_entry_t *entry = this->names.push (); hb_ot_name_entry_t *entry = this->names.push ();

View File

@ -40,7 +40,7 @@ namespace OT {
struct OS2 struct OS2
{ {
static const hb_tag_t tableTag = HB_OT_TAG_OS2; enum { tableTag = HB_OT_TAG_OS2 };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -71,7 +71,7 @@ struct postV2Tail
struct post struct post
{ {
static const hb_tag_t tableTag = HB_OT_TAG_post; enum { tableTag = HB_OT_TAG_post };
inline bool subset (hb_subset_plan_t *plan) const inline bool subset (hb_subset_plan_t *plan) const
{ {
@ -107,7 +107,7 @@ struct post
version = table->version.to_int (); version = table->version.to_int ();
if (version != 0x00020000) return; if (version != 0x00020000) return;
const postV2Tail &v2 = table->v2; const postV2Tail &v2 = table->v2X;
glyphNameIndex = &v2.glyphNameIndex; glyphNameIndex = &v2.glyphNameIndex;
pool = &StructAfter<uint8_t> (v2.glyphNameIndex); pool = &StructAfter<uint8_t> (v2.glyphNameIndex);
@ -250,7 +250,7 @@ struct post
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
return_trace (likely (c->check_struct (this) && return_trace (likely (c->check_struct (this) &&
(version.to_int () == 0x00010000 || (version.to_int () == 0x00010000 ||
(version.to_int () == 0x00020000 && v2.sanitize (c)) || (version.to_int () == 0x00020000 && v2X.sanitize (c)) ||
version.to_int () == 0x00030000))); version.to_int () == 0x00030000)));
} }
@ -286,7 +286,7 @@ struct post
* is downloaded as a Type 1 font. */ * is downloaded as a Type 1 font. */
HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font
* is downloaded as a Type 1 font. */ * is downloaded as a Type 1 font. */
postV2Tail v2; postV2Tail v2X;
DEFINE_SIZE_MIN (32); DEFINE_SIZE_MIN (32);
}; };

View File

@ -127,22 +127,25 @@ collect_features_khmer (hb_ot_shape_planner_t *plan)
for (; i < KHMER_NUM_FEATURES; i++) for (; i < KHMER_NUM_FEATURES; i++)
map->add_feature (khmer_features[i]); map->add_feature (khmer_features[i]);
map->enable_feature (HB_TAG('c','a','l','t'));
map->enable_feature (HB_TAG('c','l','i','g'));
} }
static void static void
override_features_khmer (hb_ot_shape_planner_t *plan) override_features_khmer (hb_ot_shape_planner_t *plan)
{ {
hb_ot_map_builder_t *map = &plan->map;
/* Khmer spec has 'clig' as part of required shaping features:
* "Apply feature 'clig' to form ligatures that are desired for
* typographical correctness.", hence in overrides... */
map->enable_feature (HB_TAG('c','l','i','g'));
/* Uniscribe does not apply 'kern' in Khmer. */ /* Uniscribe does not apply 'kern' in Khmer. */
if (hb_options ().uniscribe_bug_compatible) if (hb_options ().uniscribe_bug_compatible)
{ {
plan->map.disable_feature (HB_TAG('k','e','r','n')); map->disable_feature (HB_TAG('k','e','r','n'));
} }
plan->map.disable_feature (HB_TAG('l','i','g','a')); map->disable_feature (HB_TAG('l','i','g','a'));
} }

View File

@ -309,9 +309,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH); map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH);
} }
if (planner->shaper->override_features)
planner->shaper->override_features (planner);
for (unsigned int i = 0; i < num_user_features; i++) for (unsigned int i = 0; i < num_user_features; i++)
{ {
const hb_feature_t *feature = &user_features[i]; const hb_feature_t *feature = &user_features[i];
@ -330,6 +327,9 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
aat_map->add_feature (feature->tag, feature->value); aat_map->add_feature (feature->tag, feature->value);
} }
} }
if (planner->shaper->override_features)
planner->shaper->override_features (planner);
} }

View File

@ -225,7 +225,7 @@ struct AxisValue
struct STAT struct STAT
{ {
static const hb_tag_t tableTag = HB_OT_TAG_STAT; enum { tableTag = HB_OT_TAG_STAT };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -99,7 +99,7 @@ struct SegmentMaps : ArrayOf<AxisValueMap>
struct avar struct avar
{ {
static const hb_tag_t tableTag = HB_OT_TAG_avar; enum { tableTag = HB_OT_TAG_avar };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -96,7 +96,7 @@ struct AxisRecord
struct fvar struct fvar
{ {
static const hb_tag_t tableTag = HB_OT_TAG_fvar; enum { tableTag = HB_OT_TAG_fvar };
inline bool has_data (void) const { return version.to_int (); } inline bool has_data (void) const { return version.to_int (); }

View File

@ -102,8 +102,8 @@ struct DeltaSetIndexMap
struct HVARVVAR struct HVARVVAR
{ {
static const hb_tag_t HVARTag = HB_OT_TAG_HVAR; enum { HVARTag = HB_OT_TAG_HVAR };
static const hb_tag_t VVARTag = HB_OT_TAG_VVAR; enum { VVARTag = HB_OT_TAG_VVAR };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {
@ -143,10 +143,10 @@ struct HVARVVAR
}; };
struct HVAR : HVARVVAR { struct HVAR : HVARVVAR {
static const hb_tag_t tableTag = HB_OT_TAG_HVAR; enum { tableTag = HB_OT_TAG_HVAR };
}; };
struct VVAR : HVARVVAR { struct VVAR : HVARVVAR {
static const hb_tag_t tableTag = HB_OT_TAG_VVAR; enum { tableTag = HB_OT_TAG_VVAR };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -58,7 +58,7 @@ struct VariationValueRecord
struct MVAR struct MVAR
{ {
static const hb_tag_t tableTag = HB_OT_TAG_MVAR; enum { tableTag = HB_OT_TAG_MVAR };
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {

View File

@ -79,7 +79,7 @@ hb_ot_var_get_axis_count (hb_face_t *face)
* hb_ot_var_get_axes: * hb_ot_var_get_axes:
* *
* Since: 1.4.2 * Since: 1.4.2
* Deprecated: REPLACEME * Deprecated: 2.2.0
**/ **/
unsigned int unsigned int
hb_ot_var_get_axes (hb_face_t *face, hb_ot_var_get_axes (hb_face_t *face,
@ -94,7 +94,7 @@ hb_ot_var_get_axes (hb_face_t *face,
* hb_ot_var_find_axis: * hb_ot_var_find_axis:
* *
* Since: 1.4.2 * Since: 1.4.2
* Deprecated: REPLACEME * Deprecated: 2.2.0
**/ **/
hb_bool_t hb_bool_t
hb_ot_var_find_axis (hb_face_t *face, hb_ot_var_find_axis (hb_face_t *face,
@ -108,7 +108,7 @@ hb_ot_var_find_axis (hb_face_t *face,
/** /**
* hb_ot_var_get_axis_infos: * hb_ot_var_get_axis_infos:
* *
* Since: REPLACEME * Since: 2.2.0
**/ **/
HB_EXTERN unsigned int HB_EXTERN unsigned int
hb_ot_var_get_axis_infos (hb_face_t *face, hb_ot_var_get_axis_infos (hb_face_t *face,
@ -122,7 +122,7 @@ hb_ot_var_get_axis_infos (hb_face_t *face,
/** /**
* hb_ot_var_find_axis_info: * hb_ot_var_find_axis_info:
* *
* Since: REPLACEME * Since: 2.2.0
**/ **/
HB_EXTERN hb_bool_t HB_EXTERN hb_bool_t
hb_ot_var_find_axis_info (hb_face_t *face, hb_ot_var_find_axis_info (hb_face_t *face,

View File

@ -63,7 +63,7 @@ hb_ot_var_get_axis_count (hb_face_t *face);
* hb_ot_var_axis_flags_t: * hb_ot_var_axis_flags_t:
* @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces. * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
typedef enum { /*< flags >*/ typedef enum { /*< flags >*/
HB_OT_VAR_AXIS_FLAG_HIDDEN = 0x00000001u, HB_OT_VAR_AXIS_FLAG_HIDDEN = 0x00000001u,
@ -74,7 +74,7 @@ typedef enum { /*< flags >*/
/** /**
* hb_ot_var_axis_info_t: * hb_ot_var_axis_info_t:
* *
* Since: REPLACEME * Since: 2.2.0
*/ */
typedef struct hb_ot_var_axis_info_t typedef struct hb_ot_var_axis_info_t
{ {

View File

@ -57,7 +57,7 @@ struct VertOriginMetric
struct VORG struct VORG
{ {
static const hb_tag_t tableTag = HB_OT_TAG_VORG; enum { tableTag = HB_OT_TAG_VORG };
inline bool has_data (void) const { return version.to_int (); } inline bool has_data (void) const { return version.to_int (); }
@ -93,7 +93,7 @@ struct VORG
unsigned int size = VertOriginMetric::static_size * subset_metrics.len; unsigned int size = VertOriginMetric::static_size * subset_metrics.len;
VertOriginMetric *metrics = c.allocate_size<VertOriginMetric> (size); VertOriginMetric *metrics = c.allocate_size<VertOriginMetric> (size);
if (likely (metrics != nullptr)) if (likely (metrics != nullptr))
memcpy (metrics, &subset_metrics[0], size); memcpy (metrics, &subset_metrics[0u], size);
else else
success = false; success = false;
} }

View File

@ -31,6 +31,7 @@
#include "hb.h" #include "hb.h"
#include "hb-ot-color.h" #include "hb-ot-color.h"
#include "hb-ot-deprecated.h"
#include "hb-ot-font.h" #include "hb-ot-font.h"
#include "hb-ot-layout.h" #include "hb-ot-layout.h"
#include "hb-ot-math.h" #include "hb-ot-math.h"

View File

@ -50,13 +50,13 @@ struct hb_set_digest_lowest_bits_t
{ {
enum { mask_bytes = sizeof (mask_t) }; enum { mask_bytes = sizeof (mask_t) };
enum { mask_bits = sizeof (mask_t) * 8 }; enum { mask_bits = sizeof (mask_t) * 8 };
static const unsigned int num_bits = 0 enum { num_bits = 0
+ (mask_bytes >= 1 ? 3 : 0) + (mask_bytes >= 1 ? 3 : 0)
+ (mask_bytes >= 2 ? 1 : 0) + (mask_bytes >= 2 ? 1 : 0)
+ (mask_bytes >= 4 ? 1 : 0) + (mask_bytes >= 4 ? 1 : 0)
+ (mask_bytes >= 8 ? 1 : 0) + (mask_bytes >= 8 ? 1 : 0)
+ (mask_bytes >= 16? 1 : 0) + (mask_bytes >= 16? 1 : 0)
+ 0; + 0 };
static_assert ((shift < sizeof (hb_codepoint_t) * 8), ""); static_assert ((shift < sizeof (hb_codepoint_t) * 8), "");
static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), ""); static_assert ((shift + num_bits <= sizeof (hb_codepoint_t) * 8), "");

View File

@ -375,8 +375,8 @@ struct hb_set_t
if (!resize (count)) if (!resize (count))
return; return;
population = other->population; population = other->population;
memcpy (pages, other->pages, count * pages.item_size); memcpy ((void *) pages, (const void *) other->pages, count * pages.item_size);
memcpy (page_map, other->page_map, count * page_map.item_size); memcpy ((void *) page_map, (const void *) other->page_map, count * page_map.item_size);
} }
inline bool is_equal (const hb_set_t *other) const inline bool is_equal (const hb_set_t *other) const
@ -660,7 +660,7 @@ struct hb_set_t
unsigned int count = pages.len; unsigned int count = pages.len;
for (int i = count - 1; i >= 0; i++) for (int i = count - 1; i >= 0; i++)
if (!page_at (i).is_empty ()) if (!page_at (i).is_empty ())
return page_map[i].major * page_t::PAGE_BITS + page_at (i).get_max (); return page_map[(unsigned) i].major * page_t::PAGE_BITS + page_at (i).get_max ();
return INVALID; return INVALID;
} }
@ -678,7 +678,7 @@ struct hb_set_t
pages[map.index].init0 (); pages[map.index].init0 ();
memmove (page_map + i + 1, memmove (page_map + i + 1,
page_map + i, page_map + i,
(page_map.len - 1 - i) * sizeof (page_map[0])); (page_map.len - 1 - i) * page_map.item_size);
page_map[i] = map; page_map[i] = map;
} }
return &pages[page_map[i].index]; return &pages[page_map[i].index];

View File

@ -80,7 +80,7 @@ _subset2 (hb_subset_plan_t *plan)
return false; return false;
} }
retry: retry:
hb_serialize_context_t serializer (buf, buf_size); hb_serialize_context_t serializer ((void *) buf, buf_size);
hb_subset_context_t c (plan, &serializer); hb_subset_context_t c (plan, &serializer);
result = table->subset (&c); result = table->subset (&c);
if (serializer.ran_out_of_room) if (serializer.ran_out_of_room)

View File

@ -695,7 +695,7 @@ _hb_uniscribe_shape (hb_shape_plan_t *shape_plan,
{ {
active_feature_t *feature = active_features.find (&event->feature); active_feature_t *feature = active_features.find (&event->feature);
if (feature) if (feature)
active_features.remove (feature - active_features); active_features.remove (feature - active_features.arrayZ ());
} }
} }
@ -886,8 +886,8 @@ retry:
&items[i].a, &items[i].a,
script_tags[i], script_tags[i],
language_tag, language_tag,
range_char_counts, range_char_counts.arrayZ (),
range_properties, range_properties.arrayZ (),
range_properties.len, range_properties.len,
pchars + chars_offset, pchars + chars_offset,
item_chars_len, item_chars_len,
@ -927,8 +927,8 @@ retry:
&items[i].a, &items[i].a,
script_tags[i], script_tags[i],
language_tag, language_tag,
range_char_counts, range_char_counts.arrayZ (),
range_properties, range_properties.arrayZ (),
range_properties.len, range_properties.len,
pchars + chars_offset, pchars + chars_offset,
log_clusters + chars_offset, log_clusters + chars_offset,

View File

@ -101,8 +101,8 @@ struct hb_vector_t
inline hb_sorted_array_t<const Type> as_sorted_array (void) const inline hb_sorted_array_t<const Type> as_sorted_array (void) const
{ return hb_sorted_array (arrayZ(), len); } { return hb_sorted_array (arrayZ(), len); }
template <typename T> inline operator T * (void) { return arrayZ(); } template <typename T> explicit_operator inline operator T * (void) { return arrayZ(); }
template <typename T> inline operator const T * (void) const { return arrayZ(); } template <typename T> explicit_operator inline operator const T * (void) const { return arrayZ(); }
inline Type * operator + (unsigned int i) { return arrayZ() + i; } inline Type * operator + (unsigned int i) { return arrayZ() + i; }
inline const Type * operator + (unsigned int i) const { return arrayZ() + i; } inline const Type * operator + (unsigned int i) const { return arrayZ() + i; }

View File

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

View File

@ -1,31 +1,35 @@
# 10.12.6 # 10.12.6 https://gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf
/System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281:--shaper ot --font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] /System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--shaper ot --font-funcs ot:U+006D,U+0300:[mgrave=0+1912] /System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--shaper ot --font-funcs ot:U+0066,U+0069:[fi=0+1139] /System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
/Library/Fonts/Khmer MN.ttc@5f5b1072df99b7355d3066ea85fe82969d13c94a:--shaper ot --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+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] /Library/Fonts/Khmer MN.ttc@5f5b1072df99b7355d3066ea85fe82969d13c94a:--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+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593]
/Library/Fonts/Tamil MN.ttc@37a2020c3f86ebcc45e02c1de5fdf81e2676989d:--shaper ot --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] /Library/Fonts/Tamil MN.ttc@37a2020c3f86ebcc45e02c1de5fdf81e2676989d:--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.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--shaper ot --font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] /System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251]
/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--shaper ot --font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] /System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361]
/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--shaper ot --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@5fc49ae9bce39e2105864323183b68ea34c9e562:--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]
/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --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] /Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--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@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --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@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--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@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700] /System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--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@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--shaper ot --font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] /System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700]
/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--shaper ot --font-funcs ot:U+0056,U+0041,U+0056,U+0041:[gid265=0+1227|gid4=1@-65,0+1162|gid265=2@-65,0+1162|gid4=3@-65,0+1227] /System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
/System/Library/Fonts/Apple Color Emoji.ttc@d2fe8a134483aa48a43a9d1e4b7204d37a4abdf5:--remove-default-ignorables --shaper ot --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] /System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--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:[gid225=0+1105|gid584=1@-105,0+979|gid3=2+490|gid4=3+1227|gid265=4@-65,0+1227|gid3=5+490|gid225=6+1130|gid728=7@-80,0+569|gid3=8+490|gid265=9+1227|gid505=10@-65,0+997|gid3=11+490|gid728=12+609|gid225=13@-40,0+1170|gid3=14+490|gid584=15+1004|gid225=16@-80,0+1130|gid3=17+490|gid225=18+1105|gid576=19@-105,0+1068]
/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--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:[gid225=0@46,0+1197|gid584=1@-59,0+1071|gid3=2@46,0+582|gid4=3@46,0+1319|gid265=4@-19,0+1319|gid3=5@46,0+582|gid225=6@46,0+1222|gid728=7@-34,0+661|gid3=8@46,0+582|gid265=9@46,0+1319|gid505=10@-19,0+1089|gid3=11@46,0+582|gid728=12@46,0+701|gid225=13@6,0+1262|gid3=14@46,0+582|gid584=15@46,0+1096|gid225=16@-34,0+1222|gid3=17@46,0+582|gid225=18@46,0+1197|gid576=19@-59,0+1160]
/System/Library/Fonts/Apple Color Emoji.ttc@d2fe8a134483aa48a43a9d1e4b7204d37a4abdf5:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
# 10.13.6 # 10.13.6 https://gist.github.com/ebraminio/d432e831b3f7ebe30245dde5775e1c7e
/System/Library/Fonts/Helvetica.ttc@8a928f9866299d2455f41360202b7a3b48503a5e:--shaper ot --font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0] /System/Library/Fonts/Helvetica.ttc@8a928f9866299d2455f41360202b7a3b48503a5e:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--shaper ot --font-funcs ot:U+006D,U+0300:[mgrave=0+1912] /System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--shaper ot --font-funcs ot:U+0066,U+0069:[fi=0+1139] /System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
/Library/Fonts/Khmer MN.ttc@782ba6cf3fca0512ab348dfe08345a2d5dc5bf2c:--shaper ot --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+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593] /Library/Fonts/Khmer MN.ttc@782ba6cf3fca0512ab348dfe08345a2d5dc5bf2c:--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+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593]
/Library/Fonts/Tamil MN.ttc@3de37f3f8f3cb6015b093fbd6e9d323daaf6fb1d:--shaper ot --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] /Library/Fonts/Tamil MN.ttc@3de37f3f8f3cb6015b093fbd6e9d323daaf6fb1d:--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@896098b6979306ad84355025459f7c68b029139c:--shaper ot --font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251] /System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-480,588+0|fi=3+1139|Z=5+1251]
/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--shaper ot --font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361] /System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@-7,0+0|samekhhebrew=0+1361]
/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--shaper ot --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+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]
/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--shaper ot --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] /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:--shaper ot --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+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:--shaper ot --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+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:--shaper ot --font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165] /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/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--shaper ot --font-funcs ot:U+0056,U+0041,U+0056,U+0041:[gid332=0+1227|gid4=1@-65,0+1162|gid332=2@-65,0+1162|gid4=3@-65,0+1227] /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/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --shaper ot --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800] /System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--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+1055|gid658=1@-135,0+914|gid3=2+420|gid4=3+1227|gid332=4@-65,0+1227|gid3=5+420|gid282=6+1075|gid813=7@-115,0+516|gid3=8+420|gid332=9+1217|gid572=10@-75,0+953|gid3=11+420|gid813=12+546|gid282=13@-85,0+1105|gid3=14+420|gid658=15+914|gid282=16@-135,0+1055|gid3=17+420|gid282=18+1055|gid649=19@-135,0+999]
/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]